2012-06-07 152 views
1

这是主线程中的处理程序,它显示和取消进度对话框。未显示Android进度对话框

public static final int SHOW = 0; 
public static final int DISMISS = 1; 
public Handler pdHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     Log.i(TAG, "+ handleMessage(msg:" + msg + ")"); 
     switch(msg.what) { 
     case SHOW: 
      pd = ProgressDialog.show(LogViewer.this, "", getText(R.string.loading_msg), true); 
      break; 
     case DISMISS: 
      if(pd != null) { 
       pd.dismiss(); 
       pd = null; 
      } 
      break; 
     } 
    } 
}; 

显示进度的消息是:

 pdHandler.sendMessage(pdHandler.obtainMessage(SHOW)); 

消息解雇是:

 pdHandler.sendMessage(pdHandler.obtainMessage(DISMISS)); 

它运作良好,当我打电话之前,我启动的AsyncTask时, AsyncTask onPostExecute()将其解除。

但是当它运行在runnable(runOnUiThread)中时,对话框不显示。在调试器上检查 pd变量,它显示它已创建,正在运行并且可见,但实际上它不可见。

有什么建议吗?

更新:
我做了明显的测试,我应该做的第一个地方。我评论了DISMISS消息。进度对话框显示出来。在可运行结束后,它显得太晚了。
我现在不知道该DISMISS消息确实否定了不可见的ProgressDialog,这就是为什么我没有看到它。
现在的问题是:我需要ProgressDialog在可执行代码执行之前显示。它并不那么直截了当。我调用层次是这样的:

onScrollEventChanged 
    --> runOnUiThread ( 
     --> checkScrollLimits 
      --> if need to scroll 
       show ProgressDialog "Loading" 
       get new data into table 
       dismiss ProgressDIalog 
    ) 

我想是这样的:

onScrollEventChanged 
    --> checkScrollLimits 
     --> if need to scroll 
      show ProgressDialog "Loading" 
      --> runOnUiThread ( 
       get new data into table 
       dismiss ProgressDIalog 
      ) 

不过还是解除消息到达那里之前,ProgressDialog可以显示。

根据Logcat,SHOW消息的到达和DISMISS消息的到达之间有5秒的间隔。

UPDATE II:
不过,我觉得我会用ProgressDIalog

pd = ProgressDialog.show(...) 
while(!pd.isShowing()); 

的isShowing()方法,但它并不能帮助所有,它返回true,即使对话没有显示呢。

回答

0

我把它转动代码到的AsyncTask和使用try/catch块工作。

见我在this post

答案,我不知道,如果是的AsyncTask必要的,但之后,我曾经有过,的try/catch块制成的差异。

2

也许你不应该通过Looper.prepare()功能使用runOnUiThread()和更好的处理这个问题:

What is the purpose of Looper and how to use it?

而且你AsyncTask完成并运行在onPostExecute()那么你是在UI线程使一个附加runOnUiThread()是不必要。

+0

谢谢,我会考虑使用活套。 :::: AsyncTask是处理程序按预期执行的示例。我没有在AsyncTask上运行runOnUiThread。 runnable与应用程序中的其他代码相关,我需要提供相同的ProgressDialog,我使用的是runOnUiThread。 – ilomambo

0

我认为它不会work.The从正在发送消息

pdHandler.sendMessage(pdHandler广场。obtainMessage(DISMISS));

你需要把所有那些沉重的声明或工作放到另一个非ui线程中。处理程序用于将消息放入线程消息队列中,如果线程繁忙,则会在之前的消息传递后执行该消息。因为你的UI很繁重,对话框没有更新。始终为您的后台工作使用服务。切勿尝试将所有内容都放在UI线程中。

希望它会帮助你,否则使用AsyncTask这是做这种事情的最佳方法。如果仍然面临同样的问题,那么将该代码从发送消息的位置发送到处理程序。