Android后台线程管理和Activity生命周期

标签 android android-asynctask lifecycle

我有一项收集在线交易数据的 Activity 。收集完成后,我运行一个后台线程(更具体地说是 AsyncTask),它调用 Web 服务并等待其响应,然后将其返回到 Activity 。同时,会出现一个进度对话框。

我希望在应用程序完成或用户取消时取消后台进程(但是,我仍然需要通知网络服务),并在由于配置更改而破坏 Activity 时保留后台进程 释放内存。我知道我将使用 onRetainNonConfigurationInstance() 将我的 Activity 与 AsyncTask 分离,保留它,然后在下一个 Activity 中重新附加,我已经拥有了相应的基础设施。我还知道,在某些生命周期回调中, isFinishing 方法会告诉我我的应用程序是否正常关闭;我相信我也可以在进度对话框的回调中处理用户取消。

我有两个简单的问题:

  1. 如果我的 Activity 是这样,onRetainNonConfigurationInstance() 是否会被调用 因内存不足而被杀? (我知道如果原因是 配置更改。)

  2. 在什么情况下(正如开发者指南所强调的那样)onStop() 和 onDestroy() 没有被调用? (我想知道我的 处理取消的代码将始终执行。)

总而言之,我能否确定通过在检查 isFinishing() 的情况下实现 onRetainNonConfigurationInstance() 和 onDestroy(),在每种情况下,我的后台线程都会得到相应的处理?

额外问题:如果我的应用程序由于某种原因被终止(比如说永久),我怎样才能为 AsyncTask 提供一种保存响应的方法?我可以在其中保留共享首选项的实例并在其中写入数据吗?

最佳答案

Will onRetainNonConfigurationInstance() be called if my activity is killed due to low memory?

没有。您的 Activity 永远不会因内存不足而被单独终止。您的整个进程可能会因内存不足而终止,但 onRetainNonConfigurationInstance() 仅供进程内使用。

What is the situation (as emphasized by the developer guide) in which onStop() and onDestroy() are not called?

您的进程可能会由于内存不足而终止(onStop() 很可能仍会被调用,但如果 Android 处于运行状态,则 onDestroy() 可能不会被调用匆忙,例如由于接到电话)。此外,您的应用程序可能会因未处理的异常而崩溃。我不确定如果用户强制停止你是否会调用 onDestroy() ,但我对此表示怀疑。

All in all, can I be sure that by implementing onRetainNonConfigurationInstance() and onDestroy() with isFinishing() checked, in every situation, my background thread will be handled accordingly?

“每个”是一个强有力的词。如果 Android 终止您的进程,您的线程也会消失。

If my application is killed for some reason (let's say permanently), how can I provide a way for the AsyncTask to save the response anyway?

在执行其他操作之前将数据写入磁盘,并希望在此之前您不会被杀死。然后,下次运行时,请注意保存的数据正在 float ,并安排对其进行其余的工作。

关于Android后台线程管理和Activity生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033857/

相关文章:

android - 错误 :non static method 'edit' cannot be referenced in static context

android - 在 GridView 中多次调用 getView()

Android:如何从状态栏通知创建的 PendingIntent 访问 AsyncTask?

java - onProgressUpdate 不起作用

JPA @PostPersist 用法

android - Droidparts ClearableEditText

android - 拍照时启用快门音

java - 使用 AsyncTask 下载许多图像并将它们发布到 ImageView

android-activity - 具有 Activity 堆栈的全局应用程序类

wpf - 转换器的生命周期是多长?