【问题标题】:Android background thread management and activity lifecycleAndroid后台线程管理和Activity生命周期
【发布时间】:2012-01-27 13:22:42
【问题描述】:

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

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

我有两个简单的问题:

  1. 如果我的活动是 onRetainNonConfigurationInstance() 将被调用 因内存不足而死? (我知道如果原因是 配置更改。)

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

总而言之,我可以确定通过执行 onRetainNonConfigurationInstance() 和 onDestroy() 并检查 isFinishing(),在每种情况下,我的后台线程都会得到相应的处理吗?

BONUS 问题:如果我的应用程序由于某种原因被终止(假设是永久终止),我怎样才能为 AsyncTask 提供一种方法来保存响应?我可以在其中保留一个共享偏好的实例并在其中写入数据吗?

【问题讨论】:

    标签: android android-asynctask lifecycle


    【解决方案1】:

    如果我的活动因内存不足而被终止,是否会调用 onRetainNonConfigurationInstance()?

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

    onStop() 和 onDestroy() 没有被调用的情况(正如开发者指南所强调的那样)是什么情况?

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

    总而言之,我可以确定通过执行 onRetainNonConfigurationInstance() 和 onDestroy() 并检查 isFinishing(),在每种情况下,我的后台线程都会得到相应的处理吗?

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

    如果我的应用程序由于某种原因被终止(假设是永久终止),我怎样才能为 AsyncTask 提供一种方法来保存响应?

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

    【讨论】:

    • Thaks,我希望你能回答这个问题!因此,当我的进程由于内存不足而终止时,我没有机会对 isCancelled() 进行另一个 Web 服务调用,我只能希望我有足够的时间来写入数据(不过,我可以使用共享首选项吗?为此,还是它也被破坏了,因此不建议这样做?)。我想我可以在调用finish之前取消后台线程,并且onReatinNonConfigurationInstance()足以处理配置更改。
    • @Vincent:“我可以为此使用共享首选项,还是它也被破坏了,因此不建议使用?” -- SharedPreferences 中的值在卸载应用程序之前不会“销毁”。话虽如此,SharedPreferences 只是比使用其他类型的文件要好得多。如果您将数据库用于其他内容,我会考虑将您的信息存储在那里,因为它是事务性的。
    • 我不是指存储,而是我必须用来编写它的对象。据我猜测,它与当前应用程序相关联。我还没有使用数据库,因为只存储了非常少量的临时数据。但是,我会考虑这个想法,事务性听起来不错。感谢您的回答!
    猜你喜欢
    • 2016-12-14
    • 2019-02-02
    • 2013-04-06
    • 2015-05-13
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多