这是主线程中的处理程序,它显示和解除进度对话框。
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。
答案 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块来实现它。
中查看我的回答我不确定AsyncTask是否有必要,但在我使用之后, try / catch块产生了不同。