【问题标题】:ProgressDialog does not work even using threadProgressDialog 即使使用线程也不起作用
【发布时间】:2017-02-08 09:46:33
【问题描述】:

我是 Android 开发的新手。我正在尝试显示 ProgressDialog。我看到很多教程说显示对话框必须使用线程。如您所见,sn-p 代码正在使用线程。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            refreshFromFeed();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setContentView(R.layout.activity_main);
    }

private void refreshFromFeed() throws InterruptedException {
        ProgressDialog dialog = ProgressDialog.show(this,"Loading","Wake up after some sleep");
        Thread th = new Thread(){
            public void run(){
                Log.d("TimeFrom", String.valueOf(System.currentTimeMillis()/1000));
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                Log.d("TimeTo", String.valueOf(System.currentTimeMillis()/1000));
            }
        };
        th.start();
        dialog.dismiss();
    }
protected void onRefresh(View view) throws InterruptedException {
        refreshFromFeed();
    }

日志显示花费了 5 秒,但是,我在屏幕上看不到任何对话框,我可以在屏幕上执行任何操作。即使我在物理设备上使用。我使用了调试模式。也不例外。

onRefreshonClick 在其 xml 上声明的事件。

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:

    我对你的代码做了一些改动,仔细阅读。

    private void refreshFromFeed() throws InterruptedException {
        ProgressDialog dialog = ProgressDialog.show(this,"Loading","Wake up after some sleep");
        Thread th = new Thread(){
            public void run(){
                Log.d("TimeFrom", String.valueOf(System.currentTimeMillis()/1000));
                try {
                    Thread.sleep(5000);
                    dialog.dismiss();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                Log.d("TimeTo",String.valueOf(System.currentTimeMillis()/1000));
            }
        };
        th.start();
    
    }
    

    【讨论】:

    • 你是对的。我应该改变dismiss() 方法。但是,它不再起作用了:(
    【解决方案2】:
     private void refreshFromFeed() throws InterruptedException {
            final ProgressDialog dialog = ProgressDialog.show(getActivity(),"Loading","Wake up after some sleep");
            Thread th = new Thread() {
                public void run() {
                    Log.d("TimeFrom", String.valueOf(System.currentTimeMillis() / 1000));
                    try {
                        Thread.sleep(5000);
                        dialog.dismiss(); // dismiss your dialog here
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    Log.d("TimeTo", String.valueOf(System.currentTimeMillis() / 1000));
                }
            };
            th.start();
        }
    

    【讨论】:

      【解决方案3】:

      您仍然在 UI 线程中运行 ProgressDialog。

      ProgressDialog dialog = ProgressDialog.show(this,"Loading","Wake up after some sleep");
      

      在此行之后创建新线程,而不是在此行之前!

      【讨论】:

        【解决方案4】:

        您在显示对话框后立即将其关闭。 也许你想移动你的“dialog.dismiss();”到线程内部。请记住,您需要关闭 UI Thread 上的对话框,否则它会导致您的应用崩溃:

        private void refreshFromFeed() throws InterruptedException {
                final ProgressDialog dialog = ProgressDialog.show(this,"Loading","Wake up after some sleep");
                Thread th = new Thread(){
                    public void run(){
                        Log.d("TimeFrom", String.valueOf(System.currentTimeMillis()/1000));
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
        
                        Log.d("TimeTo", String.valueOf(System.currentTimeMillis()/1000));
        
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                dialog.dismiss();
                            }
                        });
                    }
                };
                th.start();
            }
        

        我看到很多教程说显示对话框必须使用线程。

        您不需要明确需要线程来显示 ProgressDialog,这只是在 5000 毫秒后关闭它的示例

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-17
          • 2011-10-30
          • 2015-09-22
          相关资源
          最近更新 更多