如果不能保证调用onDestroy,如何清理应用程序状态

时间:2016-05-13 23:07:16

标签: android

我刚注意到当Activity被销毁时,并不总是调用Activity的onDestroy。我读了android文件确实如此。我想到的一件事是,当这种强制杀戮发生时,我们怎样才能确保app状态是否干净?考虑一下这个愚蠢的代码:

公共类MainActivity扩展了AppCompatActivity {

byte[] bytes = new byte[1024 * 1024 * 100];
MyThread thread;

class MyThread extends Thread {

    Activity activity;

    @Override
    public void run() {
        activity = MainActivity.this;
        try {
            Thread.sleep(200000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    startService(new Intent(this, LongRunningService.class));
    thread = new MyThread();
    thread.start();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    thread.activity = null;
    Log.e("Test", "onDestroy called");
}

}

如果不能保证调用onDestroy,那么显然会出现严重的内存泄漏。我们如何处理这种清理?

1 个答案:

答案 0 :(得分:2)

如果您的应用被强制杀死,则该过程已停止并且内存已被回收。这不是内存泄漏。

然而,一般来说,关键是谁保留了对事物的引用。如果您只对活动的实例字段中的内容进行引用,那么当活动变为未引用时,它们将被取消引用。问题解决了。

在您的代码中,如果线程不能保证退出,那么让Thread保持活动引用确实是潜在的内存泄漏。您应该使用弱引用,或者将其基于应用程序上下文而不是活动上下文。