2016-11-18 55 views
2

我已经宣布在后台做工作课后:活动的局部变量仍然有效的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中,它正在被销毁。

+0

大概'mReportLoadTask'运行你试过它使'mReportLoadTask'对象空之前调用'mReportLoadTask.cancel'后? –

+0

'mReportLoadTask'只有在你明确设置为'null'的情况下才会变为'null' – nandsito

回答

2

如果您同时对话框正在显示旋转设备,这意味着你的任务没有执行(你有没有叫execute还)。当您旋转设备时,您的活动将被破坏并重新创建(它将从头开始,并且生命周期回调将再次被调用)。

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

+1

是的,情况就是如此。应该多检查一下工作流程。 –