ProgressDialog在执行dismiss、hide或cancel后没有消失?

3
我有一个浮层扩展,其中有两个私有属性对话框——Dialog和ProgressDialog。在MapView中单击Overlay后,出现Dialog对象。当用户点击对话框中的按钮时,对话框消失并显示ProgressDialog。同时,通过通知正在运行的服务启动后台任务。当任务完成时,在Overlay对象中调用方法(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
        }
    }
}

}


你没有展示给我们创建或展示覆盖对话框的地方。你确定 overlayDialog 引用的是同一个正在显示的对话框吗? - Falmarri
你在线程方面也有些含糊不清。当你启动后台任务时,你是使用 AsyncTask 吗?是在 AsyncTask 中调用 buildingLoaded 吗?那样行不通。 - Dan Breslau
overlayDialog 工作正常 - progressDialog 是问题所在。 - Martin
好的,这是项目的基本结构: 主活动(MapActivity)启动一个服务作为后台任务运行。当用户与地图交互时,通过意图发送一些消息到服务端,并加载和处理一些XML数据。处理完数据后,将会向主活动发送意图,该活动将找到覆盖并调用该覆盖的buildingLoaded()方法。我几乎可以确定引用了正确的对象,因为现在我只有一个对象。 - Martin
2个回答

7

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

public static ProgressDialog show (Context context, CharSequence title, CharSequence message)

正如您所看到的,该方法返回一个ProgressDialog,它不会在类的实例上执行show操作。请更新您的代码以使用以下之一:

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

或者

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

2

ProgressDialog.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;
}

所有这个方法的重载都是指向这个方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接