-1

我有一个地图视图,它显示了一些带有 ItemizedOverlay 的 pois。当我点击 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);
4

1 回答 1

1

嗯……

“//做一些工作”是否涉及在与 onTap 上使用的线程相同的线程上工作?如果是这样,那就是 ui 线程,所以你已经向 ui 线程发送了 2 条消息——一条显示,一条隐藏,在它甚至可以处理它们之前,当它最终达到可以处理它们的点时,它同时处理他们,所以在很短的时间内(可能没有注意到)progressDialog 将被显示。

无论如何,使用另一个线程进行后台工作,或使用 asyncTask 。

如果您使用 asyncTask ,您可以在工作开始之前显示对话框,并在完成/取消时隐藏它。

于 2012-07-23T23:09:51.087 回答