5

我已经测试了 AsyncTasks 不会随着它们的启动活动而被破坏的声明。这是真的

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

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

我很困惑。

  1. 如果 AsyncTaskpublishProgress()进入了被破坏的 UI 怎么办?
    我想会发生某种异常,对吧?

  2. 如果 AsyncTask 将数据存储在 的全局变量中class Application怎么办?
    这里不知道,NullPointer 异常?

  3. 如果重新启动应用程序会怎样?
    它可能会启动一个新的 AsyncTask。它可以与仍在运行的 AsyncTask 重新连接吗?

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

这一切看起来像是一场讨论,但问题就在标题中。我有这个孤立的 AsyncTask,我非常想在重新启动应用程序时重新连接它,但我不知道该怎么做。

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

4

1 回答 1

1

我希望我做对了,因为它来自一些我不再使用的旧代码(我现在使用 anIntentService来做这曾经做的事情)。

这是我最初在我的主目录中下载文件时所拥有的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是在 的方法onPostExecute(...)中设置的FileDownloader

private void doDownload() {
    // Retrieve the FileDownloader instance if previousy retained
    fdl = (FileDownloader)getLastNonConfigurationInstance();

    // If it's not null, set the Context to use for progress updates and
    // to manipulate any UI elements in onPostExecute(...)
    if (fdl != null)
        fdl.setParentActivity(this);
    else {
        // If we got here fdl is null so an instance hasn't been retained
        String[] downloadFileList = this.getResources().getStringArray(R.array.full_download_file_list);
        fdl = new FileDownloader(this);
        fdl.execute(downloadFileList);
    }
}
于 2012-05-21T17:00:45.450 回答