ProgressDialog.dismiss()和AlertDialog.show()之间的长时间延迟

时间:2011-07-07 21:52:45

标签: android optimization progressdialog

我正在使用标准的ProgressDialog实现:我设置了一个线程来运行一个长任务,当它完成时它会解除ProgressDialog。

@Override
public void onCreate( Bundle bundle ) {

        super.onCreate( bundle );

        context = this;
        progress = ProgressDialog.show( this, "Running", "Please wait..", true, false);
        progress.setOnDismissListener( new OnDismissListener() {

            public void onDismiss(DialogInterface dialog) {

                showResults();
            }

        });

        new DeleteThread().start();
}

线程看起来像这样:

private class DeleteThread extends Thread {

    public DeleteThread() {}

    @Override
    public void run() {

        // long process during which we populate
        // a LinearLayout with many other Views 
        progress.dismiss();
    }
}

showResults()中,我们现在将LinearLayout填充为Views并将其设置为AlertDialog的内容。

问题是,ProgressDialog消失了,并且仍然有很长一段时间(10-12秒),在AlertDialog弹出之前没有任何事情发生。有没有办法立即实现这种转变?

3 个答案:

答案 0 :(得分:1)

我知道这个答案可能会有点晚,但是到底是什么。

我看到你正在从onDismiss回调中触发showResults()方法。我建议你反过来做。为此,您可能需要使用AsyncTask类。

AsyncTask允许您轻松设置要在生成的线程中运行的任务,在需要时更新进度条(不是必需的,但在您的情况下可能会很好),当然还要在UI线程上运行一些代码一旦产生的线程完成。对于您的情况,我会将您的layoutview填充在AsyncTask.doInBackground()方法中。然后,您需要在AsyncTask.onPostExecute()中添加showResults()方法调用。在onPostExecute()的底部,您应该关闭进度对话框。那应该给你你想要的结果。

作为奖励,您可能希望为AsyncTask类创建构造函数,并在其中创建ProgressDialog。这样,ProgressDialog将完全封装在该类中,一切都很好,干净。所以,像这样:

class MyAsyncClass extends AsyncClass
{
  ProgressDialog m_progress;

  public MyAsyncClass()
  {
    m_progress = ProgressDialog.show( this, "Running", "Please wait..", true, false);
  }

  protected Long doInBackground(Object... data) {
    // Do your long process of populating a LinearLayout with many other Views 
  }

  protected void onPostExecute(Long result) {
    showResults();
    m_progress.dismiss();
  }
}

注意:上面需要一些额外的参数给你,但你明白了。

答案 1 :(得分:0)

作为一名新手Android开发人员,我想冒昧地猜测,虽然为LinearLayout生成了指针,但布局本身还没有填充内容,因此当你调用progress.dismiss()时会填充它。

您可能必须在设置AlertDialogs内容之前渲染视图。 http://developer.android.com/guide/topics/ui/how-android-draws.html可能在这方面有一些帮助,不幸的是我的笔记本电脑有硬盘问题所以我没有安装Android开发环境,也无法尝试。但是我会在progress.dismiss()之前尝试使用LinearLayout上的无效,我希望有帮助:S

答案 2 :(得分:0)

使用下面的内容并使用AsyncTask,一旦完成就会解散对话:

final ProgressDialog progressDialog = new ProgressDialog(v.getContext());

progressDialog.setCancelable(false);
progressDialog.setMessage(v.getContext().getText(R.string.defaultQuantities));
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);

new CountDownTimer(250, 250) {
    public void onTick(long millisUntilFinished) {
    }

    public void onFinish() {
        if (progressDialog.getProgress() < 100) {
        progressDialog.show();
        }
    }
}.start();