我有一个mapview,显示了一些带有ItemizedOverlay的poi。当我点击POI时,一些工作开始,并且需要几秒钟。在onTap方法中,我调用处理程序来显示对话框,并隐藏它。
我调试代码,并检查是否正确调用了处理程序开关的case Util.SHOW_DIALOG:
,但对话框没有显示给用户.....
我的代码出了什么问题?
这是我的MyMapActivity类的一部分,因为你可以看到我的mapview有一个处理程序:
public Handler dialogHandler;
private ProgressDialog progressDialog;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
.
/* handler para mostrar y ocultar el reloj de carga */
dialogHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch( msg.what ){
case Util.SHOW_DIALOG:
progressDialog = ProgressDialog.show(MyMapActivity.this, "" , "Cargando...", false );
break;
case Util.HIDE_DIALOG:
if( progressDialog != null )
progressDialog.dismiss();
progressDialog = null;
break;
}
}
};
这是ItemizedOverlay类的一部分,ItemizedOverlay
的onTap方法使用以下代码调用处理程序:
protected boolean onTap(int index) {
try{
OverlayItem item = (OverlayItem)this.mOverlays.get(index);
map.dialogHandler.sendEmptyMessage(Util.SHOW_DIALOG);
.
.
//doing some work
.
.
map.dialogHandler.sendEmptyMessage(Util.HIDE_DIALOG);
答案 0 :(得分:1)
“//做一些工作”是否涉及与onTap上使用的线程相同的线程? 如果是这样,那就是ui线程,所以你发送了ui线程2消息 - 一个显示,一个隐藏,甚至可以处理它们,当它最终到达它可以处理它们的点时,它处理两个它们,所以在非常短的时间内(可能没有注意到)将显示progressDialog。
无论如何,使用另一个线程进行后台工作,或者使用asyncTask。
如果你使用asyncTask,你可以在工作开始前显示对话框,并在完成/取消时隐藏它。