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

时间:2012-01-27 13:22:42

标签: android android-asynctask lifecycle

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

如果应用程序完成或用户取消(但仍需要通知Web服务),我希望取消后台进程,并且如果由于配置更改释放记忆。我知道我将使用onRetainNonConfigurationInstance()从AsyncTask中分离我的活动,保留它,然后重新连接到下一个活动,我已经有了基础设施。我也知道在一些生命周期回调中,isFinishing方法告诉我我的应用程序是否正常关闭;我相信我也可以在进度对话框的回调中处理用户取消。

我有两个简单的问题:

  1. 如果我的活动是,则会调用onRetainNonConfigurationInstance() 内存不足导致死亡? (我知道如果原因是这样的话 配置改变。)

  2. 没有调用onStop()和onDestroy()的情况(由开发人员指南强调)? (我想知道我的     处理取消的代码总是会执行。)

  3. 总而言之,我可以确定通过在isFinishing()中选中onRetainNonConfigurationInstance()和onDestroy(),在每种情况下,我的后台线程都会相应地处理吗?

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

1 个答案:

答案 0 :(得分:3)

  

如果我的活动因内存不足而被杀死,那么会调用onRetainNonConfigurationInstance()吗?

没有。由于内存不足,您的活动永远不会被单独杀死由于内存不足,您的整个过程可能会终止,但onRetainNonConfigurationInstance()仅适用于进程内使用。

  

没有调用onStop()和onDestroy()的情况(由开发人员指南强调)?

由于内存条件较差,您的流程可能会被终止(onStop()很可能仍会被调用,但如果Android匆忙,onDestroy()可能不会,例如由于来电呼叫)。此外,您的应用可能会因未处理的异常而崩溃。如果用户强行阻止你,我不确定是否会调用onDestroy(),但我对此表示怀疑。

  

总而言之,我可以确定通过在isFinishing()中选中onRetainNonConfigurationInstance()和onDestroy(),在每种情况下,我的后台线程都会相应地处理吗?

"每"是一个强有力的词。如果Android终止了你的进程,你的线程也会消失。

  

如果我的应用程序因某种原因被终止(让我们永久地说),我怎样才能为AsyncTask提供保存响应的方法呢?

在执行任何其他操作之前将数据写入磁盘,并希望在此之前不会被杀死。然后,下次运行时,请注意这些保存的数据是浮动的,并安排在其上完成剩余的工作。