Android 如果无法保证调用onDestroy,如何清理应用程序状态
我只是注意到,当活动被销毁时,并不总是调用活动的onDestroy。我读了安卓文档,确实如此。我想到的一件事是,当这种强制杀戮发生时,我们如何确保应用程序状态是干净的?考虑这个愚蠢的代码: 公共类MainActivity扩展了AppCompatActivity{Android 如果无法保证调用onDestroy,如何清理应用程序状态,android,Android,我只是注意到,当活动被销毁时,并不总是调用活动的onDestroy。我读了安卓文档,确实如此。我想到的一件事是,当这种强制杀戮发生时,我们如何确保应用程序状态是干净的?考虑这个愚蠢的代码: 公共类MainActivity扩展了AppCompatActivity{ byte[] bytes = new byte[1024 * 1024 * 100]; MyThread thread; class MyThread extends Thread { Activity activity;
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,那么显然会出现严重的内存泄漏。我们如何处理这种清理?如果您的应用程序被强制终止,进程将停止,内存将被回收。这不是内存泄漏 然而,一般来说,这都是关于谁保留对事物的引用。如果仅在活动的实例字段中保留对事物的引用,则当活动变为未引用时,它们将变为未引用。问题解决了
在您的代码中,如果线程不能保证退出,那么让
线程
保留活动引用确实是一种潜在的内存泄漏。您应该使用弱引用,或者基于应用程序上下文而不是活动上下文。如果您的应用程序被强制终止,则进程将停止,内存将被回收。这不是内存泄漏
然而,一般来说,这都是关于谁保留对事物的引用。如果仅在活动的实例字段中保留对事物的引用,则当活动变为未引用时,它们将变为未引用。问题解决了
在您的代码中,如果线程不能保证退出,那么让
线程
保留活动引用确实是一种潜在的内存泄漏。您应该使用弱引用,或者基于应用程序上下文而不是活动上下文。onPause()
总是被调用,是“保存”内容的好地方。如果您使用的是AsyncTask
而不是线程
,那么您可以在onPause
期间取消AsyncTask
,这也可以让您做得更多。onPause()
总是被调用,是“保存”内容的好地方。如果您使用的是AsyncTask
而不是线程
,则可以在onPause
期间取消AsyncTask
,这也可以让您做得更多。谢谢。说明是否有包含活动和前台服务的应用程序。是否可能已终止活动,但未终止服务?或者android只会在每个进程的基础上称赞资源?我知道我提供的代码很愚蠢,只是一个极端的例子。更普遍的问题是,在这些强制杀戮的情况下,如何清理应用程序状态并持久化数据?或者我们根本不需要考虑它?它有可能被破坏(它是'nDebug())方法,而不是服务的<代码> OnDebug()/<代码>方法。如果“kill”是指unix进程被终止,那么不是,除非您指定活动和服务在不同的进程中运行(这不是默认值)。谢谢。说明是否有包含活动和前台服务的应用程序。是否可能已终止活动,但未终止服务?或者android只会在每个进程的基础上称赞资源?我知道我提供的代码很愚蠢,只是一个极端的例子。更普遍的问题是,在这些强制杀戮的情况下,如何清理应用程序状态并持久化数据?或者我们根本不需要考虑它?它有可能被破坏(它是'nDebug())方法,而不是服务的<代码> OnDebug()/<代码>方法。如果“kill”是指unix进程被终止,那么不是,除非您指定活动和服务在不同的进程中运行(这不是默认值)。