我正在编写应用程序,我有以下场景:首先我显示一个 Acitivty 并在从服务器加载数据时显示一个 ProgressDialog。我在线程中执行加载任务,因为我发现这是一个解决方案,以便正确显示对话框
showDialog(DIALOG_LOAD);
loadListThread = new Thread(new Runnable(){
@Override
public void run(){
service.execRequest();
loadingFinishedHandler.sendEmptyMessage(0);
MyActivity.this.dismissDialog(MyActivity.DIALOG_LOAD);
}
});
loadListThread.start();
线程完成后,我通知处理程序。同样,这是我发现的问题的解决方案,可以访问活动中的视图而不再处于线程中
loadingFinishedHandler = new Handler(){
@Override
public void handleMessage(Message msg){
showList();
}
};
加载完成后,我检查我是否正确接收数据。如果没有,我想显示一个错误对话框:
showDialog(DIALOG_ERROR);
我用 onCreateDialog 方法调用对话框
public Dialog onCreateDialog(int dialogId){
switch(dialogId){
case DIALOG_LOAD:
String message = getString(R.string.load);
ProgressDialog loadDialog = new ProgressDialog(this);
loadDialog.setMessage(message);
loadDialog.setCancelable(false);
return loadDialog;
case DIALOG_ERROR:
String message = getString(R.string.error);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(errorMessage);
builder.setNeutralButton(getString(R.string.ok), null);
return builder.create();
}
return null;
}
这就是问题所在:如果我在加载数据时更改手机的方向,并且之后会创建一个错误对话框,我会收到此消息
Activity [...] has leaked window [...] that was originally added here
我明白为什么会这样。视图已重新创建,当我旋转手机并且 showDialog() 显然试图访问旧手机时。但我不知道如何解决它。
有人有想法吗?
编辑:解决了 :-) 我发现我可以阻止我的活动在方向改变时重新启动。我在这篇文章处理运行时更改中读到了它
我通过添加在 AndroidManifest 中声明
android:configChanges="orientation"
我自己处理方向变化。现在可以使用此方法处理这些更改
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
但就我而言,没有必要添加任何代码!