显示 ProgressDialog 并在一段时间后调用 OnBackPressed()

Posted

技术标签:

【中文标题】显示 ProgressDialog 并在一段时间后调用 OnBackPressed()【英文标题】:Show ProgressDialog and call OnBackPressed() after certain period 【发布时间】:2019-02-18 11:27:22 【问题描述】:

ProgressDialog 应该显示 5 秒,然后 OnBackPressed() 应该执行。目前 ProgressDialog 从未出现在屏幕上。如果我将 OnBackPressed() 放在委托进度对话框中,则会显示该对话框,但我会收到错误消息,即 OnBackPressed() 应该从 MainThread 执行。我能做什么?

private async SomeAsyncMethod()

   await ShowProgressDialog();
   ......


private Task ShowMessage()
        
            var progressDialog = ProgressDialog.Show(this, "Bestandskorrektur", "Bestandskorrektur wird ausgeführt! Bite warten...", true);
            new Thread(new ThreadStart(delegate
            
                Thread.Sleep(5000);
                RunOnUiThread(() => progressDialog.Hide());
                OnBackPressed(); // Gives error.
            )).Start();

            return Task.CompletedTask;
        

更新:基于答案的解决方案:

var pd = ProgressDialog.Show(this, "Bestandskorrektur", "Bestandskorrektur wird ausgeführt! Bitte warten...", true);
                var h = new Handler();
                void action()
                
                    RunOnUiThread(() => pd.Hide());
                    OnBackPressed();
                
                h.PostDelayed(action, 5000);

【问题讨论】:

在 onBackpressed() 检查 progressDialog 是否仍然显示然后关闭它。 【参考方案1】:

尝试使用如下所示的 Handler().postDelayed() -

new Handler().postDelayed(new Runnable() 
                    @Override
                    public void run() 
                        //hide progressbar
                        onBackPressed();
                    
                , 5000);

【讨论】:

【参考方案2】:

onBackPressed() 应该从 UI 线程调用。达山建议的是正确答案。当您想从后台线程(在本例中为等待计时器完成的线程)更新 UI 时,您应该使用 Handler。代替线程,替换

new Handler().postDelayed(new Runnable() 
                    @Override
                    public void run() 
                        //Do your work here

                    
                , /*Delay in miliseconds*/ );

【讨论】:

如何在 Monodroid 中使用 Runnable()?

以上是关于显示 ProgressDialog 并在一段时间后调用 OnBackPressed()的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个新线程并在一段时间后终止它?

显示 ProgressDialog Android

sun.security.provider.SHA2 使用 100% cpu 并在一段时间后挂起 5 分钟

什么可能导致我的程序在一段时间后不使用所有内核?

Zookeeper 服务器在一段时间后关闭

如何处理显示 ProgressDialog 的方向变化?