有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java showDialog()正在访问旧视图=>错误:活动已泄漏窗口[…]

我正在编写应用程序,我有以下场景: 首先,在从服务器加载数据时,我显示一个活动和一个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()显然正在尝试访问旧视图。但我不知道如何修复它

有人有主意吗

编辑:解决了它:-) 我发现我可以阻止我的活动在方向改变时重新启动。我在这篇文章中读到过 Handling Runtime Changes

我在AndroidManifest中声明

安卓:configChanges="orientation"

我自己处理方向的变化。现在可以使用此方法处理这些更改

public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
}

但是对于我来说,没有必要添加任何代码


共 (1) 个答案

  1. # 1 楼答案

    public Dialog onCreateDialog(int dialogId){
    if(isFinishing()){
    return null;)}...