如何从AsyncTask中的onPostExecute发回数据?

时间:2012-02-25 20:12:06

标签: android android-intent

我的问题与此相同 Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread 但我想将数据发送回同一个调用活动。对于意图的startActivity总是重启活动

2 个答案:

答案 0 :(得分:16)

On选项是使用侦听器,您可以在其中创建活动实现的接口,例如:

public interface AsyncListener {
    public void doStuff( MyObject obj );
}

这样,如果你是AslassTask的子类,很容易添加这个监听器,那么在onPostExecute()中,你可以这样做:

protected void onPostExecute( MyObject obj ) {
   asyncListener.doStuff(obj);
}

答案 1 :(得分:7)

这取决于您的类结构,但如果您的AsyncTask是您的Activity中的类,那么您可以引用该活动的方法。 你要做的是在onPostExecute方法中调用Activity的一个函数,它将在AsyncTask中检索到的一些数据传递给你可以使用它的活动。

代码看起来像这样

class YourActivity extends Activity {
   private static final int DIALOG_LOADING = 1;

   public void onCreate(Bundle savedState) {
     setContentView(R.layout.yourlayout);
     showDialog(DIALOG_LOADING);     
     new LongRunningTask1().execute(1,2,3);

   } 

   protected Dialog onCreateDialog(int dialogId) {
     switch(dialogId) {
       case DIALOG_LOADING:
           ProgressDialog pDialog = new ProgressDialog(this);
           pDialog.setTitle("Loading Data");
           pDialog.setMessage("Loading Data, please wait...");
           return pDialog;
        default:
            return super.onCreateDialog(dialogId);
      }      
   }

   private void onBackgroundTaskDataObtained(List<String> results) {
      dismissDialog(DIALOG_LOADING);
     //do stuff with the results here..
   }

   private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
        @Override
        protected void onPreExecute() {
          //do pre execute stuff
        }

        @Override
        protected List<String> doInBackground(Long... params) {
            List<String> myData = new ArrayList<String>(); 
            for (int i = 0; i < params.length; i++) {
                try {
                    Thread.sleep(params[i] * 1000);
                    myData.add("Some Data" + i);
                } catch(InterruptedException ex) {
                }                
            }
            return myData;
        }

        @Override
        protected void onPostExecute(List<String> result) {
            YourActivity.this.onBackgroundTaskDataObtained(result);
        }    
    }

}

所以典型的流程是这样的,设置当前页面的视图,然后显示进度对话框。在那之后就开始执行异步任务(或者无论何时,它都没关系)。

异步任务完成后,调用活动的函数并将数据传递给它。 不要在异步任务中使用共享数据,否则就会出现线程问题。相反,一旦完成,就将其传递给活动。如果您想在工作时逐步更新视图,可以在onProgressUpdate

上使用