我的问题是这样的 Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread 但我想发回数据回到相同的调用活动。没有startActivity意图总是重新开始活动如何在AsyncTask中从onPostExecute发回数据?
7
A
回答
13
使用On选择是使用监听器,在那里你创建一个接口,你的活动implents,是这样的:
public interface AsyncListener {
public void doStuff(MyObject obj);
}
这样,如果您继承AsyncTask,则很容易添加此侦听器,然后在onPostExecute()中,您可以执行类似操作:
protected void onPostExecute(MyObject obj) {
asyncListener.doStuff(obj);
}
6
这取决于您的类结构,但是如果您的AsyncTask是您的活动中的类,那么您可以引用该活动的方法。 你会怎么做是你onPostExecute方法调用传递被中的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
相关问题
- 1. 数据库从AsyncTask更新onPostExecute
- 2. 从AsyncTask中onPostExecute更新textview
- 3. 的AsyncTask在OnPostExecute
- 4. 从AsyncTask调用不同的回调onPostExecute()
- 5. 如何从AsyncTask onPostExecute显示Toast?
- 6. AsyncTask中的NullPointerException OnPostExecute
- 7. NPE在AsyncTask的OnPostExecute()
- 8. 错误在AsyncTask onPostExecute
- 9. 在AsyncTask中使用canvas.drawBitmap onPostExecute
- 10. 在AsyncTask中重写onPostExecute()
- 11. 的AsyncTask从不执行onPostExecute
- 12. 从AsyncTask onPostExecute mehod不叫
- 13. 如何从AsyncTask类的onPostExecute方法返回值?
- 14. onPostExecute取消AsyncTask
- 15. onPostExecute Looper AsyncTask
- 16. asynctask取消onpostexecute
- 17. IllegalStateException asynctask - onPostExecute
- 18. 如何仅在AsyncTask的onPostExecute()执行后才返回值?
- 19. AsyncTask - 如何在onPostExecute之后将值传递回活动类?
- 20. 如何onpostexecute方法的AsyncTask的数据拆分成阵列
- 21. 覆盖AsyncTask中的onPostExecute()
- 22. AsyncTask类的返回值onPostExecute方法
- 23. AsyncTask onPostExecute不返回doInBackground的结果
- 24. AsyncTask - onPostExecute UI混淆
- 25. AsyncTask not calling onProgressUpdate,onPostExecute
- 26. Android AsyncTask not calling onPostExecute
- 27. 错误是asynctask onPostExecute
- 28. AsyncTask onPostExecute不输出
- 29. 从AsyncTask类返回数据
- 30. Android屏幕旋转后从嵌套的AsyncTask onPostExecute保存数据
谢谢您的回答。我不是AsyncTask被用作子类的粉丝。我想你应该能够使用事件。我认为答案是使用意图,但我只会创建一个我不想要的活动的新实例。 – skinnybrit51 2012-02-25 20:45:57
您可以轻松地在自己的类中使用AsyncTask,但只有在您使用来自多个不同活动的相同逻辑时才有用。在这种情况下,您可以:1.使用公共基类(不是活动,而是扩展活动),然后你会有一个可以从异步任务中调用的通用方法。或者更好的是,让他们都实现一个通用接口,它具有我所描述的回调。将对活动的引用传递给AsyncTask的构造函数,并确保asyncTask具有构造函数,该构造函数接受接口类型的参数。 – 2012-02-25 20:49:37
你最后的选择是完全抛弃AsyncTask,并把它放到一个你需要创建一个新线程来执行后台活动的服务中(因为默认情况下服务不会在自己的线程中运行)。一个简单的方法是创建一个IntentService,为您创建一个新的线程。 – 2012-02-25 20:51:45