从AsyncTask中更新数据

时间:2015-05-10 11:16:36

标签: android list android-asynctask

如何从AsyncTask类(内部)向我从接收服务器的数据中添加元素到Array或ArrayList。

我尝试添加doInBackgroud()中的元素并将它们打印在onPostExecute()中,然后就可以了。

但是当我尝试在AsyncTask类之外访问它们时,Array和List都是空的。

代码: -

public  String[][] mov_details ;

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.vpmovies);

    mov_details=new String[NUM_OF_MOVIES][9];
    new MyHttpMovies().execute();
    Toast.makeText(this,mov_details[0][2],Toast.LENGTH_LONG).show();   //prints blank

doInBackgroud()和onPostExecute() -

 for(int i=0; i < jsonArray.length(); i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                             //parsing some json 


                mov_details[i][0] = (jsonObject.optString("name").toString());
                mov_details[i][1] = (jsonObject.optString("lang").toString());
                mov_details[i][2] = (jsonObject.optString("genre").toString());
                                        . 
                                        .
                                        .
                                        .

return mov_details;
}

protected void onPostExecute(String[][] strings) {
        super.onPostExecute(strings);

         Toast.makeText(VPmovies.this,strings[0][1],Toast.LENGTH_LONG).show(); 
 // prints successfully

    }

3 个答案:

答案 0 :(得分:0)

public class MainActivity extends AppCompatActivity {

ArrayList<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
    }

public class fetchData extends AsyncTask<Void,Void,Void> {
        @Override
        protected Void onPreExecute() {
          super.onPreExecute();
          list = new ArrayList<String>();
        }
        @Override
        protected Void onPostExecute(Void... params) {
           ...
          list.add("bla bla");
           ...
          return null;
        }

}

}

答案 1 :(得分:0)

publishProgress("data")内使用doInBackgroung,并将数据从AsyncTask传递到Activity/Fragment。请记住doInBackgroung在单独的线程中运行,如果您将直接从doInBackgroung调用某些方法而不是您的调用方法应在主线程中运行,则无法直接从doInBackgroung更新主GUI。

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    // send data to your required location its recommended to use interfaces for communication
}

答案 2 :(得分:0)

只需在appspot.com实例上使用get()方法解决,该方法将返回AsyncTask背景线程的输出/结果。

AsyncTask

而不是在mov_details = new MyHttpMovies().execute().get(); //returns 2d array 中使用mov_details变量,我使用了一些其他的2d数组变量只是AsyncTask。