【问题标题】:(Android) How to catch application main thread termination (if it is put in backround)(Android)如何捕捉应用程序主线程终止(如果它放在后台)
【发布时间】:2013-12-03 20:14:02
【问题描述】:

嗯,在我的 Android 应用程序中,我很少有单例对象来处理整个应用程序的一些需求(如服务器请求、数据下载、应用程序内日志收集器和其他一些需求)。

所有这些单例对象都有自己的状态并存储一些完整的应用程序数据(如服务器上打开的用户会话或其他)。屏幕上显示的大多数活动在(重新)创建视图期间使用单例数据。另一方面,活动就像“前景/视图”,而单例对象就像“背景”。

有时在应用程序使用过程中,用户切换到主屏幕或其他应用程序。 在最后一个活动从屏幕上隐藏一段时间后,我们让应用程序主线程运行,所有单例对象都存在于内存中并在该线程中工作。

最后一个是我想要的 - 尽可能将所有单例对象存储在“背景”中。 (几乎没有什么原因,例如“初始化所有这些可能需要一些时间”(如果用户在最近的时间返回应用程序,我不想开始重新初始化)或“一些网络功能需要通过向服务器的通知正确完成 "...)

但是 - 有一段时间,当 android 决定是杀死所有没有显示活动的进程的好时机。为了释放一些记忆,可能是因为心情不好。 它使用我的所有单例对象破坏了主应用程序进程。

这里是我的问题:我需要处理那个时刻——为了保存我的单例对象的内部状态,或者只是为了制作像“我被关闭”这样的日志注释——我不这样做不知道该怎么做。 (例如,在那种情况下不调用 .finalize())。

处理应用程序单例对象销毁(不是活动!)的最佳方式是什么。

ps:谢谢,抱歉英语不好)

【问题讨论】:

    标签: java android singleton


    【解决方案1】:

    扩展Application 并覆盖其事件处理程序。具体来说,onTrimMemory 和 onLowMemory 应该会警告您是时候清理了。

    也就是说,过度使用单例似乎表明设计不佳。如果不经常使用但需要持久化,您可能应该使用服务或将状态存储在数据库中。

    【讨论】:

    • 我不认为我们可以假设如果操作系统杀死应用程序总是由于内存不足。即使是这样,它也是依赖于操作系统版本的行为。
    • 我和戴夫一起做这个。我不认为 OP 滥用单例。我感觉服务对于服务器请求、数据下载和日志收集器来说会更好。
    【解决方案2】:

    持久化数据最简单的方法可能是共享首选项。

    http://developer.android.com/guide/topics/data/data-storage.html#pref

    现在你说的是尽可能长时间地在内存中保存单例,即使周围没有活动。这是不可取的,我认为这是不可能的,除非你采用你可能认为有效但最终不会的“聪明”技巧。嘿,你甚至不能保证你的活动不会被操作系统杀死。您当然可以使用任何持久性机制(首选项、文件、数据库等)来持久化单例状态,但这不会很快。从持久性中读取或从网络中获取总是会降低性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2023-04-03
      • 2011-02-03
      相关资源
      最近更新 更多