0

我正在编写应用程序,我有以下场景:首先我显示一个 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);
}

但就我而言,没有必要添加任何代码!

4

1 回答 1

0
public Dialog onCreateDialog(int dialogId){
if(isFinishing()){
return null;)}...
于 2011-09-06T15:38:33.320 回答