【问题标题】:show progressdialog not showing in asyctask显示进度对话框未在 asyctask 中显示
【发布时间】:2016-07-06 23:58:07
【问题描述】:

在 android app onCreate 期间,我有一堆代码在一些旧设备上可能会很慢。我想在所有初始化代码运行时显示进度对话框。如果从 onCreate 调用,则不会显示对话框,因为进一步的代码会阻止 UI。所以它需要进入一个AsyncTask。

这是我的任务。

class startupTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(mainContext);
        pd.setMessage("Starting up.  Please wait...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.show();

        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
                pd.show();
                runInit();
            }
        });
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (pd != null) {
            pd.dismiss();
        }
        super.onPostExecute(result);
    }
}

但对话框仍然没有显示? runInit 是通常的慢启动代码。它需要在 UI 上运行。

如果我删除 pd.dismiss 调用,则在初始化代码完成后会出现进度对话框,因此它正在创建中,只是不显示。

根据其他帖子,上面的代码是正确的方法,但是从 onCreate 调用时它似乎不起作用?

有什么方法可以在调用显示后强制显示对话框?有什么方法可以让对话框显示并等到它可见后再继续?

感谢您的帮助。

编辑:最后我只好硬着头皮重新组织代码,以便只有缓慢的非 UI 代码在 AsyncTask 中。这让它工作了。

【问题讨论】:

  • 你为什么在doInBackground中打电话给pd.show();
  • 只是尝试显示对话框。它没有帮助。
  • 您的问题在于“runInit 是通常的慢启动代码。它需要在 UI 上运行”。这违背了 asynctask 的目的,即将这些东西移出 UI 线程。描述 runInit() 正在做什么,有人可以帮助您找到在 UI 线程之外执行此操作的方法。

标签: android android-asynctask progressdialog


【解决方案1】:

你的 runInit 在做什么?你在 UI 线程上运行,它以同样的方式被阻塞。

【讨论】:

  • 是的,runInit 正在(并且需要)在 UI 线程上运行。在运行 UI 三广告代码之前,有没有其他方法可以让我显示进度对话框?
  • 进度正在显示,但之后立即被阻止,我不应该在 UI 上运行它,或者您没有遵循最佳实践。为了帮助我们需要有关 runInit 正在做什么的信息。
【解决方案2】:

onPreExecute()、onPostExecute() 和 onProgressUpdate() 可以访问 UI 线程,但 doInBackground() 没有。

如果 runInit() 在 UI 上执行某些操作,它会被阻止,并且可能会生成您忽略的异常。

您应该对 doInBackground 进行操作,并使用 publishProgress() 将要更新到 UI / ProgressBar 状态的数据发送到 onProgressUpdate()。

这是一个例子:

new AsyncTask<Void,Object,Void>()
{
    @Override
    protected Void doInBackground(Void... params)
    {
        Object[] _progress = new Object[]{"Decompressing", 1};
        publishProgress(_progress);               
    }

    @Override
    protected void onPostExecute(Void params)
    {

    }
    @Override
    protected void onPreExecute()
    {

    }
    @Override
    protected void onProgressUpdate(Object... values)
    {
        txtProgress.setText(values[0].toString());
        progressBar.setProgress(Integer.parseInt(values[1].toString()));
    }
}.execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多