我刚注意到当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,那么显然会出现严重的内存泄漏。我们如何处理这种清理?
答案 0 :(得分:2)
如果您的应用被强制杀死,则该过程已停止并且内存已被回收。这不是内存泄漏。
然而,一般来说,关键是谁保留了对事物的引用。如果您只对活动的实例字段中的内容进行引用,那么当活动变为未引用时,它们将被取消引用。问题解决了。在您的代码中,如果线程不能保证退出,那么让Thread
保持活动引用确实是潜在的内存泄漏。您应该使用弱引用,或者将其基于应用程序上下文而不是活动上下文。