在OnDestroy()之后,Activity的局部变量仍然有效

时间:2016-11-18 10:28:04

标签: android android-asynctask ondestroy

我已经宣布了一个在后台工作的课程:

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生命周期方法(OnPauseOnStopOnDestroy),甚至其他局部变量(某些int s)也被销毁了但是这个变量似乎“生存”。那是为什么?

在探索网络之后,似乎Android正在某个地方保留对此对象的引用,但它可以保留在哪里?对此对象的唯一引用是在我的Activity中,它正在被销毁。

1 个答案:

答案 0 :(得分:2)

如果在显示对话框时旋转设备,则表示您的任务未执行(您尚未调用execute)。当您旋转设备时,您的活动将被销毁并重新创建(它将从头开始,生命周期回调将再次调用)。

重新创建活动后,再次调用mReportLoadTask = new ReportLoadTask(this, barcode, this)并获得new instance