这里有一段示例代码让我有些失落:
package com.leak;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
public class WindowLeakActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new LeakThread().execute();
}
class LeakThread extends AsyncTask<Void, Void,Void>{
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog=new ProgressDialog(WindowLeakActivity.this);
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
finish();
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
//that would be ok
if(WindowLeakActivity.this!=null && !WindowLeakActivity.this.isFinishing())
dialog.dismiss();
}
}}
如您所见,我创建了一个LeakThread,并在doInBackground()方法中完成了WindowLeakActivity。
为了防止窗口泄漏错误,我必须在onPostExecute()方法中检查Activity是否已经完成。这让我有点不确定。我有以下问题:
- 在onPostExecute中对Activity实例进行isFinish()检查是否安全?如果我的线程类不是Activity的内部类,我是否需要先检查Activity实例不为null?
- Activity实例何时会消失?根据Activity的生命周期描述,当回调调用onDestroy()时,它将终止。但是,Activity的线程仍在运行。虽然它的窗口不可见,但我仍然可以获取它的实例。
- 如果我调用System.gc(),它会收集Activity的实例吗?
对不起,我的表述不好。非常感谢您阅读我的问题。