这是主线程中的处理程序,它显示和关闭进度对话框。
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。