ProgressDialog没有显示即使我使用一个线程,因为我有这个(内onCreate()方法)的任务

问题描述:

ProgressDialog没有显示即使我使用一个线程,因为我有这个(内onCreate()方法)的任务

    private ProgressDialog pDialog; //(this is in the header) 
        . 
        . 
        . 
        //This is onCreate() method 
        pDialog=new ProgressDialog(MenuActivity.this); 
        pDialog.setMessage(getString(R.string.downloading)); 
        pDialog.setCancelable(false); 
        ...some lines of code... 
        pDialog.show(); 
        Thread thread = new Thread(new Runnable() { 
         @Override 
         public void run() { 
          resultados=timeConsumingTask(); 
         } 
        }); 
        thread.start(); 
        try { 
         thread.join(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 

        if(resultados.contains(1)){ 
         if(pDialog!=null){ 
          if(pDialog.isShowing()){ 
           pDialog.dismiss(); 
          } 
         } 
         doSomething(); 
        }else{ 
         if(pDialog!=null){ 
          if(pDialog.isShowing()){ 
           pDialog.dismiss(); 
          } 
         } 
         doOtherThing(); 
        { 

我已经看过所有的教程,并在每所以在这里回答。他们每个人都说你必须做pDialog.show();就在耗时任务之前,但显然我缺少一些东西,因为pDialog从不显示。

你能帮我展示一下,并在if里面解雇它吗?

谢谢。

编辑:

也许相关的是,我打电话的FloatingActionButton的onclick()方法)

+0

请问您可以在这里发布pDialog对象初始化代码吗? –

+0

当然,我要编辑我的问题。 – Fustigador

+0

Diloag是一个UI组件应该与主UI线程一起使用而不是后台线程 – Stallion

的show()方法,一切如果UI被阻止在某一点上对话框不会被显示。

thread.join();阻止您的UI线程。

尝试使用AsyncTask代替线程,并将线程终止后执行的代码放在AsyncTask.onPostExecute()上。

+0

删除join();并将if移动到另一个方法,从thread()内部调用,这个技巧。另外,我不得不关闭runOnUiThreadMethod中的pDialog()。你的回答让我走上正轨。谢谢! – Fustigador

要渲染任何UI部件活动,必须完成/完成OnCreate()函数调用。

由于您试图显示和隐藏来自同一功能的进度对话框,因此它不会在屏幕上显示效果。

而且这样做的Thread.join()你是阻止其阻止在OnCreate()完成,并导致显示和隐藏中的onCreate()

解决方案进度对话框的主要威胁:尝试执行您的timeConsumingTask()在没有thread.join()的线程上使用runOnUiThread()方法来隐藏线程本身的progressDialog