为进度对话框添加延迟

16

我想让一个虚拟的进度对话框出现,持续2到3秒钟。它除了显示“检测中”之外不会有其他操作。我已经有了代码:

    ProgressDialog dialog = ProgressDialog.show(this, "", "Detecting...",
            true);
    dialog.show();

    dialog.dismiss();

但是我应该在展示和关闭之间放什么,才能让对话框出现几秒钟?谢谢!

6个回答

62

正确的方法 - 它不会阻塞您的主线程,因此UI保持响应:

dialog.show();

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        dialog.dismiss();
    }
}, 3000); // 3000 milliseconds delay

你的回答很棒,只是在最后一行之前还有一个额外的花括号缺失: } }, 3000); // 3000 毫秒 - DEzra
不好意思!在等待过程中,我们如何更新进度对话框上的消息。例如: 5秒... 4秒... 3秒... 2秒... 1秒... BOOOOM!并解除。 - Maziar Aboualizadehbehbahani

3
        progress.setProgress(100);
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            public void run() {
                pdialog.dismiss();
            }}, 3000);

2

您也可以使用Android的CountDownTimer,它比其他任何解决方案都更有效,并且通过其onTick()方法还支持定期触发

请看以下示例,

 new CountDownTimer(3000, 1000) {

     public void onTick(long millisUntilFinished) {
             // You don't need anything here
     }

     public void onFinish() {
         dialog.dismiss();
     }
  }.start();

这正是我所需要的,Handler函数无法在Leanback中使用:D - Evan Ngo

1
你可以像这样做:

你可以做类似于这样的事情:

new AsyncTask<Void, Void, Void>
{
    ProgressDialog dialog = new ProgressDialog(MainActivity.this);
    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        dialog.setTitle("Please wait");
        dialog.setMessage("Preparing resources...");
        dialog.setCancelable(false);
        dialog.show();
    }


    @Override
    protected Void doInBackground(Void... params) {
        try{
           Thread.sleep(3000);
        } 
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPostExecute(Void aVoid) 
    {
        super.onPostExecute(aVoid);
        if (dialog!=null && dialog.isShowing())
        {
            dialog.dismiss();
        }
    }
}.execute();

0

如果有人正在寻找使用C#的Xamarin.Android解决方案(Peter Knego's answer),这里是方法:

new Handler().PostDelayed(() => { 
    dialog.dismiss();
}, 1000);

0

关闭和显示之间没有任何东西...时间取决于您。例如,对话框将在服务器访问之前显示,并在获取结果后关闭。

 dialog.show();
 ServerCall();
 dialog.close();

如果您需要空延迟,则可以在它们之间使用CountDownTimer调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接