2

我有以下代码Activity

// Cache object is holding other resources like thread handle, file handle.
// Explicit clean up is required when it is no longer used.
public static Cache cache = new Cache();

@Override
public void onPause() {
    super.onPause();

    if (this.isFinishing()) {
        cache.cleanUp();
    }
}

请注意,我需要进行isFinishing检查,因为手机轮换、主页新闻、启动新活动......也会触发onPause。因此,由于这种“简单”操作而清理缓存破坏了拥有 Cache 对象的目的。

但是,我的设计中存在资源泄漏的可能性。

  1. 运行应用程序
  2. 新闻主页
  3. 通过运行其他内存密集型应用程序,按 Home,再次运行其他应用程序来运行它们。
  4. 在某些时候,系统发现它应该删除我的应用程序,因为它已经有一段时间没有激活了。因此,cache将变为空。但是,我没有机会调用 cache.cleanUp
  5. 长按主页按钮。我的应用程序仍应出现在列表中。
  6. 选择它。该活动将再次 onCreate,并且将再次创建静态缓存的第二个实例。

在这种情况下,我们遇到了资源泄漏,因为之前分配的旧线程句柄、第一个缓存对象拥有的文件句柄仍在系统中。我们无法处理它们,因为第一个缓存对象已被系统销毁。

我希望系统有一个回调,每当系统由于主页按下而决定销毁我的应用程序时。通过这样的回调,我可以在静态对象被销毁之前对它们执行必要的清理调用。

我可以知道我怎么能做到这一点?

4

3 回答 3

1

在这种情况下,我们遇到了资源泄漏,因为之前分配的旧线程句柄、第一个缓存对象拥有的文件句柄仍在系统中

GC 会处理它。这就是您的应用程序被杀死的原因。这样这样的内存就会被其他应用程序清理和使用。

于 2013-05-28T05:23:20.830 回答
0

Home键按下没有回调方法。如果您想在 Home 键按下时销毁您的应用程序,最好在后键按下时设置一个静态变量(onKeyUp 和 if keycode==back_key)。和 onPause 方法,如果未设置该变量,则销毁该活动 (finish();)。

长按主页按钮。我的应用程序仍应出现在列表中。在 :: 最近活动的列表中,它不依赖于终止您的活动等...

于 2013-05-28T05:22:13.210 回答
0
if(cache!=null) {
    cache.cleanUp();
}

最好假设“我会这样做,并且只有在缓存不为空时才这样做”的逻辑。

于 2013-05-28T05:14:31.423 回答