1

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

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() 将其关闭。

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

有什么建议吗?

更新:
我首先做了我应该做的明显测试。我评论了 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 秒的时间间隔。

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

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

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

4

3 回答 3

2

也许您不应该使用runOnUiThread()并通过以下Looper.prepare()功能更好地处理它:

Looper 的目的是什么以及如何使用它?

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

于 2012-06-07T16:07:27.500 回答
0

我认为它不起作用。您发送消息的地方

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

您需要将所有这些繁重的语句或工作放入另一个非 ui 线程。处理程序用于将消息放入线程消息队列中,如果您的线程将忙,那么它将在上一条消息之后执行该消息。因此,由于您的 ui 工作繁重,该对话框没有更新。始终将服务用于您的后台工作。永远不要试图把所有东西都放在你的 UI 线程中。

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

于 2012-06-07T16:26:49.810 回答
0

我通过将代码转换为 AsyncTask 并使用 try/catch 块使其工作。

在这篇文章中查看我的答案

我不确定 AsyncTask 是否是必要的,但在我拥有它之后,try/catch 块产生了影响。

于 2012-06-10T13:00:37.757 回答