显示progressdialog未在asyctask

时间:2016-07-06 23:58:07

标签: android android-asynctask progressdialog

在Android应用程序onCreate期间,我有一堆代码,在某些旧设备上可能会很慢。我想在所有init代码运行时显示progressdialog。如果从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调用它似乎不起作用?

在调用show之后强制显示对话框的任何方法?我可以用任何方式让对话框显示并等到可见之后再继续吗?

感谢您的帮助。

编辑:最后我只需要咬紧牙关并重新组织代码,以便只有缓慢的非UI代码才能进入AsyncTask。这让它发挥作用。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

这是一个例子:

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();