Android进度对话框未显示

时间:2012-06-07 15:54:58

标签: android visibility progressdialog runnable

这是主线程中的处理程序,它显示和解除进度对话框。

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消息到达之间有五秒钟的间隔。

更新II:
我虽然会使用ProgressDIalog的isShowing()方法

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

但它根本没有帮助,即使对话框尚未显示,它也会返回true。

3 个答案:

答案 0 :(得分:2)

也许您不应该使用runOnUiThread()并通过Looper.prepare()函数更好地处理此问题:

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

此外,您的AsyncTask已完成并在onPostExecute()中运行,然后您在UI-Thread中,因此无需额外runOnUiThread()

答案 1 :(得分:0)

我认为它不起作用。你发送信息的地方

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

你需要把所有那些沉重的陈述或工作放到另一个非ui线程中。如果你的线程忙,那么Handler用于将消息放入线程消息队列中,然后它将在上一次消息之后执行该消息。因此,由于你的ui繁重的工作,对话框没有更新。始终将服务用于您的后台工作。切勿尝试将所有内容都放在UI线程中。

希望它能帮助你否则使用AsyncTask它是做这些事情的最佳方法。如果您仍然面临同样的问题,请将您的消息发送到处理程序的代码发布。

答案 2 :(得分:0)

我通过将代码转换为AsyncTask并使用try / catch块来实现它。

this post

中查看我的回答

我不确定AsyncTask是否有必要,但在我使用之后, try / catch块产生了不同。