首页 > 解决方案 > 为什么使用以下代码在 onPostExecute() 中调用 progressDialog.dismiss() 不能正常工作?

问题描述

这取决于我在哪里调用progressDialog.show()。

如果我像下面的代码那样调用它,对话框将被关闭。

/** AsyncTask **/

@Override
protected void onPreExecute() {
    mProgressDialog.setMax(MAX_VALUE);
    mProgressDialog.setProgress(0);
    mProgressDialog.show();
}

@Override
protected void onPostExecute(Object o) {
    mProgressDialog.dismiss(); // it works!!
    super.onPostExecute(o);
}

但是如果我使用下面的代码,它就不起作用。
我的意思是对话框没有关闭。

/** A.java **/

private DownloadListener mDownloadListener = new DownloadListener() {
    @Override
    public void onCompleted() {
        Handler handler = new Handler(Looper.getMainLooper());

        ...

        } else {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mDecompressor.initialize(mContext, mDecompressListener);
                }
            }, 0);
        }
    }
};

/** B.java **/

public void initialize(final Context context,
                       final DecompressListener listener) {
    if(initialized(context)) return;

    showProgressBar(context);

    ...

    mUnzipTask = new UnzipTask(context, mProgressDialog, listener, dirPath, filePath);
    mUnzipTask.execute();
}

private void showProgressBar(final Context context) {
    mProgressDialog = new ProgressDialog(context);
    ...
    mProgressDialog.show();
}

/** AsyncTask **/

@Override
protected void onPostExecute(Object o) {
    mProgressDialog.dismiss(); // it doesn't work (Dialog isn't closed)
    super.onPostExecute(o);
}

我很困惑,因为这两种情况也会打开 UI 线程上的对话框。
但是第一个有效,第二个无效。

谁知道它有什么不同?

标签: android

解决方案


推荐阅读