我已经宣布了一个在后台工作的课程:
public class ReportLoadTask extends AsyncTask<Void,Void, ReportLoadTaskResult> {
public ReportLoadTask(Context context, String barcode, ReportLoadTaskListener l) {
...
}
}
我正在使用此类的实例作为Activity
的局部变量:
private ReportLoadTask mReportLoadTask;
...
在课程代码的一个点上我正在准备一项任务,然后通过显示AlertDialog
让用户决定是否继续:
mReportLoadTask = new ReportLoadTask(this, barcode, this)
...
new AlertDialog.Builder(this)
.setMessage("Continue with search?" )
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mReportLoadTask.execute();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mReportLoadTask = null;
return;
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
测试时,如果我在显示mReportLoadTask
时销毁null
(例如通过旋转设备),我希望Activity
成为AlertDialog
。但在实践中,这不会发生。正确调用了所有Activity
生命周期方法(OnPause
,OnStop
,OnDestroy
),甚至其他局部变量(某些int
s)也被销毁了但是这个变量似乎“生存”。那是为什么?
在探索网络之后,似乎Android正在某个地方保留对此对象的引用,但它可以保留在哪里?对此对象的唯一引用是在我的Activity
中,它正在被销毁。
答案 0 :(得分:2)
如果在显示对话框时旋转设备,则表示您的任务未执行(您尚未调用execute
)。当您旋转设备时,您的活动将被销毁并重新创建(它将从头开始,生命周期回调将再次调用)。
重新创建活动后,再次调用mReportLoadTask = new ReportLoadTask(this, barcode, this)
并获得new instance
。