gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:14 25 4
gpt4 key购买 nike

我已经测试了 AsyncTasks 没有随着它们的启动 Activity 而被销毁的声明。这是真实的

我让 AsyncTask 每 3 秒发布一条 Log.i() 消息,持续 1 分钟。我将 Log.i() 消息放入 Activity 的 onDestroy() 方法中。

我看到 Activity 已被销毁,但 AsyncTask 继续运行,直到它完成所有 20 个 Log.i() 消息。

我很困惑。

  1. 如果 AsyncTask 将 publishProgress() 放入被破坏的 UI 中会怎样?
    我猜会发生某种异常,对吧?

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

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

  4. mother app被销毁后AsyncTask是否永生?
    也许是的,所有 LogCat 应用程序如何在 UI 应用程序不再可见(可能已被破坏)时继续记录消息?当您重新打开它们时,它们会向您显示它“死”时生成的消息。

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

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

最佳答案

我希望我做对了,因为它来自一些我不再使用的旧代码(我现在使用 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() 的方法,如果 Boolean 指示 downloadComplete onResume() 调用该方法 为真。 BooleanFileDownloaderonPostExecute(...) 方法中设置。

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);
}
}

关于Android 如何在 onDestroy() 后重新连接到 AsyncTask 并重新启动 onCreate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10688878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com