Android 执行“解除”、“隐藏”或“取消”后,ProgressDialog不会消失?

Android 执行“解除”、“隐藏”或“取消”后,ProgressDialog不会消失?,android,progressdialog,Android,Progressdialog,我有一个覆盖扩展,它有两个对话框作为私有属性-一个对话框和一个ProgressDialog。在地图视图中单击覆盖后,将显示对话框对象。当用户单击对话框中的按钮时,该按钮将消失,并显示ProgressDialog。同时,通过通知正在运行的服务启动后台任务。任务完成后,将调用覆盖对象中的方法(buildingLoaded)来切换视图并关闭ProgressDialog。视图正在切换,代码正在运行(我用调试器检查过),但ProgressDialog没有被取消。我还尝试了hide()和cancel()方法

我有一个覆盖扩展,它有两个对话框作为私有属性-一个对话框和一个ProgressDialog。在地图视图中单击覆盖后,将显示对话框对象。当用户单击对话框中的按钮时,该按钮将消失,并显示ProgressDialog。同时,通过通知正在运行的服务启动后台任务。任务完成后,将调用覆盖对象中的方法(buildingLoaded)来切换视图并关闭ProgressDialog。视图正在切换,代码正在运行(我用调试器检查过),但ProgressDialog没有被取消。我还尝试了hide()和cancel()方法,但没有任何效果。有人能帮我吗? Android版本是2.2

代码如下:

public class LODOverlay extends Overlay implements OnClickListener {



private Dialog overlayDialog;

private ProgressDialog progressDialog;

       ..............


@Override
public void onClick(View view) {

                   .......

        final Context ctx = view.getContext();
        this.progressDialog = new ProgressDialog(ctx);
        ListView lv = new ListView(ctx);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ctx, R.layout.layerlist, names);
        lv.setAdapter(adapter);
        final LODOverlay obj = this;
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                String name = ((TextView) view).getText().toString();
        Intent getFloorIntent = new Intent(Map.RENDERER);
        getFloorIntent.putExtra("type", "onGetBuildingLayer");
        getFloorIntent.putExtra("id", name);
        view.getContext().sendBroadcast(getFloorIntent);
        overlayDialog.dismiss();

        obj.waitingForLayer = name;

        progressDialog.show(ctx, "Loading...", "Wait!!!");


            }
        });

    .......
}


public void buildingLoaded(String id) {
    if (null != this.progressDialog) {
        if (id.equals(this.waitingForLayer)) {
            this.progressDialog.hide();
            this.progressDialog.dismiss();

    ............

            Map.flipper.showNext();  // changes the view
        }
    }
}
公共类LODOverlay扩展了Overlay实现OnClickListener{
专用对话框覆盖对话框;
私有进程对话;
..............
@凌驾
公共void onClick(视图){
.......
final Context ctx=view.getContext();
this.progressDialog=新建progressDialog(ctx);
ListView lv=新的ListView(ctx);
ArrayAdapter=新的ArrayAdapter(ctx,R.layout.layerlist,名称);
低压设置适配器(适配器);
最终LODj=此;
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
字符串名称=((TextView)视图).getText().toString();
Intent getFloorPrintent=新Intent(Map.RENDERER);
GetFloorPrintent.putExtra(“类型”、“onGetBuildingLayer”);
getFloorPrintent.putExtra(“id”,名称);
view.getContext().sendBroadcast(getFloorPrintent);
overlydialog.disclose();
obj.waitingForLayer=名称;
progressDialog.show(ctx,“加载…”,“等待!!!”);
}
});
.......
}
已加载公共void buildingLoaded(字符串id){
if(null!=此.progressDialog){
if(id.equals(this.waitingForLayer)){
this.progressDialog.hide();
此.progressDialog.discouse()文件;
............
Map.flipper.showNext();//更改视图
}
}
}

}

不确定这是否是问题的原因,但在
ProgressDialog
上调用的方法是
static
,但在类的实例上调用它。以下是方法定义:

public static ProgressDialog show (Context context, CharSequence title, CharSequence message)
如您所见,方法返回
ProgressDialog
,它不会对类的实例执行
show
操作。更新代码以使用以下选项之一:

progressDialog.setTitle("Loading...");
progressDialog.setMessage("Wait!!!");
progressDialog.show();

show(…)方法实际上在返回对话框之前对对话框执行show()。以下是Android.jar源代码:

public static ProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate,
        boolean cancelable, OnCancelListener cancelListener) {
    ProgressDialog dialog = new ProgressDialog(context);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.setIndeterminate(indeterminate);
    dialog.setCancelable(cancelable);
    dialog.setOnCancelListener(cancelListener);
    dialog.show();
    return dialog;
}

此方法的所有重载都引用此方法。

您不会向我们显示您在何处创建或显示OverlyDialog。你确定OverlyDialog引用的是显示的同一个对话框吗?你对线程也有点模糊。启动后台任务时,是否使用AsyncTask?调用
buildingLoaded
AsyncTask
是否已加载?那不行。OverlyDialog工作正常-progressDialog是问题所在。好的,下面是项目的基本结构:主活动(MapActivity)启动一个服务作为后台任务运行。当用户与地图交互时,一些消息通过意图发送到服务,并加载和处理一些XML数据。处理完数据后,将向主活动发送一个意图,主活动将查找覆盖并调用该覆盖的buildingLoaded()方法。我几乎可以肯定,引用了正确的对象,因为我现在只有一个对象。
public static ProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate,
        boolean cancelable, OnCancelListener cancelListener) {
    ProgressDialog dialog = new ProgressDialog(context);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.setIndeterminate(indeterminate);
    dialog.setCancelable(cancelable);
    dialog.setOnCancelListener(cancelListener);
    dialog.show();
    return dialog;
}