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