我知道这里有一百万个类似的问题,但那里提出的解决方案都没有解决我遇到的问题。我有一个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
从未解除。我有什么理由不能在回调中做到这一点吗?
答案 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();
}