无法从活动回调中解除progressDialog

时间:2015-05-07 01:22:38

标签: android android-asynctask

我知道这里有一百万个类似的问题,但那里提出的解决方案都没有解决我遇到的问题。我有一个AsyncTask从数据库加载数据。加载数据时会显示一个不确定的ProgressDialog(即使在生产代码中,加载数据库时也不会花费明显的时间,但万一有人构建了一个巨大的数据库)。

我曾经直接从ProgressDialog致电和解雇AsyncTask,而且效果很好。问题是,我试图强制更好地分离问题,我决定在屏幕上显示内容并不属于AsyncTask域,并且真正属于该活动。所以我为活动实现了一个回调接口,并在我的活动中实现了:

private ProgressDialog progressDialog;

@Override
public void onPreExecute() {
    progressDialog = ProgressDialog.show(this,"","Loading. . .",true,true);
}

@Override
public void onPostExecute() {
    if (progressDialog != null) {
        Logger.d("Dismissing progress dialog");
        progressDialog.dismiss();
        progressDialog = null;
    }
}

Logcat显示我已到达该记录器行,但ProgressDialog从未解除。我有什么理由不能在回调中做到这一点吗?

2 个答案:

答案 0 :(得分:1)

最有可能的是,正在实例化多个ProgressDialog

因此,在成功调用dismiss()时,屏幕上当前可见的ProgressDialog上没有调用它,并且由于您已覆盖{{1},因此您丢失了对此可见引用的引用使用新的对象实例。

尝试将progressDialog放在您创建Logger.d("New ProgressDialog");的新实例的位置,您很可能会看到此方案已确认。

您可以使用ProgressDialog / Array来跟踪所有List并在相应的ProgressDialog完成时关闭相应的AsyncTask来解决此问题。但我个人认为,这比让每个AsyncTask处理自己的ProgressDialog生命周期的原始方法更复杂。

答案 1 :(得分:0)

这项工作对我来说:

if(progressDialog == null) {
    // initialize your progress dialog object 
}
if (progressDialog.isShowing() && progress != null) {
    progress.dismiss();
}