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