【问题标题】:Activity's local variable still valid after OnDestroy()Activity 的局部变量在 OnDestroy() 之后仍然有效
【发布时间】:2016-11-18 10:28:04
【问题描述】:

我已经声明了一个在后台工作的类:

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();

测试时,如果我在显示AlertDialog 时销毁Activity(例如通过旋转设备),我期望mReportLoadTask 变为null。但在实践中,这不会发生。所有Activity 生命周期方法(OnPauseOnStopOnDestroy)都被正确调用,甚至其他局部变量(一些ints)都被破坏了,但这个变量似乎以某种方式“存活”。这是为什么呢?

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

【问题讨论】:

  • 可能mReportLoadTask 正在运行,在使mReportLoadTask 对象为null 之前调用mReportLoadTask.cancel 后是否尝试过?
  • mReportLoadTask 只有在明确设置 null 时才会变为 null

标签: android android-asynctask ondestroy


【解决方案1】:

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

当重新创建活动时,再次调用 mReportLoadTask = new ReportLoadTask(this, barcode, this) 并且您将获得 new instance

【讨论】:

  • 是的,就是这样。应该多检查一下工作流程。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多