Android如何在onDestroy()之后重新连接到AsyncTask并重新启动onCreate()?

时间:2012-05-21 16:22:17

标签: android android-asynctask lifecycle

我已经测试了AsyncTasks没有被破坏以及它们的启动活动的声明。它是 true

我让AsyncTask每3秒发布一条Log.i()消息,持续1分钟。我在活动的Log.i()方法中添加onDestroy()消息。

我看到活动被破坏了,但AsyncTask一直在运行,直到它完成所有20条Log.i()消息。

我很困惑。

  1. 如果AsyncTask在已销毁的用户界面中有publishProgress()怎么办? 我想会发生某种异常,对吗?

  2. 如果AsyncTask将数据存储在class Application的全局变量中,该怎么办? 不知道NullPointer例外吗?

  3. 如果应用重新启动该怎么办? 它可能会推出一个新的AsyncTask。它可以与仍在运行的AsyncTask重新连接吗?

  4. 母版应用程序被销毁后,AsyncTask是不朽的吗? 也许是的,当UI应用程序不再可见时,所有LogCat应用程序如何记录日志消息,可能会被破坏?当你重新打开它们时,它们会向你显示在它“死”时产生的消息。

  5. 所有这些似乎都是一个讨论,但问题在于标题。我有这个孤儿AsyncTask,我非常想重新连接应用程序重新启动,但我不知道该怎么做。

    我忘了告诉为什么这很重要。当方向发生变化时,应用程序会被销毁。而且我不想丢失AsyncTask生成的数据,我不想阻止它并重新启动它。我只是希望它继续进行并在方向更改完成后重新连接。

1 个答案:

答案 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