我有一项活动,我在其中收集在线交易的数据。收集完成后,我运行一个后台线程(更具体地说是AsyncTask)来调用Web服务并等待其响应,然后将其返回给活动。同时,会出现一个进度对话框。
如果应用程序完成或用户取消(但仍需要通知Web服务),我希望取消后台进程,并且如果由于配置更改或释放记忆。我知道我将使用onRetainNonConfigurationInstance()从AsyncTask中分离我的活动,保留它,然后重新连接到下一个活动,我已经有了基础设施。我也知道在一些生命周期回调中,isFinishing方法告诉我我的应用程序是否正常关闭;我相信我也可以在进度对话框的回调中处理用户取消。
我有两个简单的问题:
如果我的活动是,则会调用onRetainNonConfigurationInstance() 内存不足导致死亡? (我知道如果原因是这样的话 配置改变。)
没有调用onStop()和onDestroy()的情况(由开发人员指南强调)? (我想知道我的 处理取消的代码总是会执行。)
总而言之,我可以确定通过在isFinishing()中选中onRetainNonConfigurationInstance()和onDestroy(),在每种情况下,我的后台线程都会相应地处理吗?
奖励问题:如果我的应用程序由于某种原因被杀死(让我们说永久),我怎样才能为AsyncTask提供一种保存响应的方法呢?我可以在其中保留共享首选项的实例并在其中写入数据吗?
答案 0 :(得分:3)
如果我的活动因内存不足而被杀死,那么会调用onRetainNonConfigurationInstance()吗?
没有。由于内存不足,您的活动永远不会被单独杀死由于内存不足,您的整个过程可能会终止,但onRetainNonConfigurationInstance()
仅适用于进程内使用。
没有调用onStop()和onDestroy()的情况(由开发人员指南强调)?
由于内存条件较差,您的流程可能会被终止(onStop()
很可能仍会被调用,但如果Android匆忙,onDestroy()
可能不会,例如由于来电呼叫)。此外,您的应用可能会因未处理的异常而崩溃。如果用户强行阻止你,我不确定是否会调用onDestroy()
,但我对此表示怀疑。
总而言之,我可以确定通过在isFinishing()中选中onRetainNonConfigurationInstance()和onDestroy(),在每种情况下,我的后台线程都会相应地处理吗?
"每"是一个强有力的词。如果Android终止了你的进程,你的线程也会消失。
如果我的应用程序因某种原因被终止(让我们永久地说),我怎样才能为AsyncTask提供保存响应的方法呢?
在执行任何其他操作之前将数据写入磁盘,并希望在此之前不会被杀死。然后,下次运行时,请注意这些保存的数据是浮动的,并安排在其上完成剩余的工作。