我已经测试了AsyncTasks没有被破坏以及它们的启动活动的声明。它是 true 。
我让AsyncTask每3秒发布一条Log.i()
消息,持续1分钟。我在活动的Log.i()
方法中添加onDestroy()
消息。
我看到活动被破坏了,但AsyncTask一直在运行,直到它完成所有20条Log.i()
消息。
我很困惑。
如果AsyncTask在已销毁的用户界面中有publishProgress()
怎么办?
我想会发生某种异常,对吗?
如果AsyncTask将数据存储在class Application
的全局变量中,该怎么办?
不知道NullPointer例外吗?
如果应用重新启动该怎么办? 它可能会推出一个新的AsyncTask。它可以与仍在运行的AsyncTask重新连接吗?
母版应用程序被销毁后,AsyncTask是不朽的吗? 也许是的,当UI应用程序不再可见时,所有LogCat应用程序如何记录日志消息,可能会被破坏?当你重新打开它们时,它们会向你显示在它“死”时产生的消息。
所有这些似乎都是一个讨论,但问题在于标题。我有这个孤儿AsyncTask,我非常想重新连接应用程序重新启动,但我不知道该怎么做。
我忘了告诉为什么这很重要。当方向发生变化时,应用程序会被销毁。而且我不想丢失AsyncTask生成的数据,我不想阻止它并重新启动它。我只是希望它继续进行并在方向更改完成后重新连接。
答案 0 :(得分:1)
我希望我能做到这一点,因为它来自我不再使用的一些旧代码(我现在使用IntentService
来执行以前的操作)。
这是我在主Activity
...
public class MyMainActivity extends Activity {
FileDownloader fdl = null;
...
// This is an inner class of my main Activity
private class FileDownloader extends AsyncTask<String, String, Boolean> {
private MyMainActivity parentActivity = null;
protected void setParentActivity(MyMainActivity parentActivity) {
this.parentActivity = parentActivity;
}
public FileDownloader(MyMainActivity parentActivity) {
this.parentActivity = parentActivity;
}
// Rest of normal AsyncTask methods here
}
}
关键是使用onRetainNonConfigurationInstance()
“保存”AsyncTask
。
Override
public Object onRetainNonConfigurationInstance() {
// If it exists then we MUST set the parent Activity to null
// before returning it as once the orientation re-creates the
// Activity, the original Context will be invalid
if (fdl != null)
fdl.setParentActivity(null);
return(fdl);
}
然后我有一个名为doDownload()
的方法,如果onResume()
表示Boolean
为真,则从downloadComplete
调用。 Boolean
的{{1}}方法设置为onPostExecute(...)
。
FileDownloader