【问题标题】:ProgressDialog in AsyncTask dismiss not workingAsyncTask 中的 ProgressDialog 关闭不起作用
【发布时间】:2026-01-22 11:25:01
【问题描述】:

我有一个带有服务类的 android 应用程序,可以与 RestWebService 进行通信。 服务类的方法使用 AsyncTasks。我想在执行 AsyncTask 期间显示 ProgressDialog。因此我有一个私人领域

public final class UserService extends Service {
    private static final String LOG_TAG = UserService.class.getSimpleName();
    private static UserService instance = null;
    private ProgressDialog progressDialog;

    public static UserService getInstance() {
        if (instance == null) {
            instance = new UserService();
        }

        return instance;
    }
...

}

在方法showProgressDialog(Context ctx)中实例化:

private ProgressDialog showProgressDialog(Context ctx) {
    progressDialog = new ProgressDialog(ctx);
    progressDialog.setProgressStyle(STYLE_SPINNER);
    progressDialog.setCancelable(true);
    progressDialog.show();
    return progressDialog;
}

我在我的 AsyncTask 的 onPreExecute 上调用此方法:

@Override
protected void onPreExecute() {
    progressDialog = showProgressDialog(ctx);
}

并尝试在 onPostExecute 中关闭它:

@Override
protected void onPostExecute(HttpResponse<User> unused) {
        Log.v(LOG_TAG, "onPostExecute");
        progressDialog.dismiss();
}

我看到,onPostExecute 方法被执行了,因为 Log 命令的原因,但是我的 ProgressDialog 没有关闭。

我做错了什么?

非常感谢您的回答!

【问题讨论】:

  • 您是否在服务中显示进度对话框?

标签: java android android-asynctask progressdialog


【解决方案1】:

如果您的 asynctask 是外部类,请确保在 preExecute 中执行 progressdialog.show() 之前已在构造函数中初始化了 progressdialog 对象。

【讨论】:

    【解决方案2】:

    没有显示您的ProgressDialog正确

    显示后,调用:

    private ProgressDialog dialog;
    
    // store the reference, "this" is the Context
    dialog = ProgressDialog.show(this, "title...", "message..."); 
    

    隐藏后,使用存储的引用

    dialog.dismiss();
    

    【讨论】:

    • OP的显摆风格有什么问题?