3

我正在使用这段代码:

public void Close() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            switch(which) {
            case DialogInterface.BUTTON_POSITIVE:
                dialog.dismiss();
                MainActivity.this.finish();
                break;
            case DialogInterface.BUTTON_NEGATIVE:
                dialog.cancel();
                break;
            }
        }
    };
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Thanks");
    builder.setPositiveButton("Quit", dialogClickListener);
    builder.setNegativeButton("Stay", dialogClickListener);
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            builder.show();

        }
    });
}

当用户选择退出时调用 Close()。它会打开一个警报框“构建器”。当我在构建器上选择“退出”时,我收到此错误:

06-23 18:32:25.230: E/WindowManager(532): 活动 com.amateurprogs.championpkg.MainActivity 泄露了最初添加在这里的窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@41768940
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowLeaked: Activity com.amateurprogs.championpkg.MainActivity 泄露了窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@41768940最初添加在这里
06-23 18:32:25.230: E/WindowManager(532): 在 android.view.ViewRootImpl.(ViewRootImpl.java:344)
06-23 18:32:25.230: E/WindowManager(532): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
06-23 18:32:25.230: E/WindowManager(532): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
06-23 18:32:25.230: E/WindowManager(532): 在 android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
06-23 18:32:25.230: E/WindowManager(532): 在 android.view.Window$LocalWindowManager.addView(Window.java:537)
06-23 18:32:25.230: E/WindowManager(532): 在 android.app.Dialog.show(Dialog.java:278)
06-23 18:32:25.230: E/WindowManager(532): 在 android.app.AlertDialog$Builder.show(AlertDialog.java:932)
06-23 18:32:25.230: E/WindowManager(532): at com.amaturprogs.championpkg.MainActivity$2.run(MainActivity.java:42)

MainActivity.java 的第 42 行引用了 builder.show()。

在选择“退出”按钮时,我执行 dialog.dismiss(),然后执行 Activity.finish()。仍然我得到一个窗口泄漏。

为什么即使在 dialog.dismiss() 上我也会收到此错误。

4

3 回答 3

1

您需要在onPause()oronDestroy()方法中关闭对话框

于 2017-06-01T09:53:51.463 回答
0

谢谢回答我的问题。实际上,我是从非活动类调用 Close(),因此是 runOnUiThread()。我期待 dialog.dismiss() 将在调用 activity.finish() 之前完成其工作。无论如何,我将使用 dialog.builder.create() 并尝试您的解决方案。

于 2012-06-24T08:11:47.997 回答
0

所以一开始,你的代码写得很脏。没有理由将您的侦听器包装到close()方法中,只需OnClickListener像声明普通方法一样声明即可。 其次,

也没有理由打电话dialog.show()runOnUiThread只是当用户点击时Quit Button,才调用dialog.show()

改变我的意思。


更新:这是工作示例:

package com.sajmon.test; // sajmon is my old nick

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class TestActivity extends Activity implements View.OnClickListener {

    protected static final int CREATE_CLOSE_DIALOG = 1245;
    protected Button someBtn;
    protected AlertDialog diag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        someBtn = (Button) findViewById(R.id.btn);
        someBtn.setOnClickListener(this);

    }


    public void onClick(View view) {
        if (view.getId() == R.id.btn) {
            diag = createDialog(CREATE_CLOSE_DIALOG);
            diag.show();
        }
    }

    private AlertDialog createDialog(int type) {
        AlertDialog dialog = null;
        switch (type) {
        case CREATE_CLOSE_DIALOG:
            dialog = new AlertDialog.Builder(TestActivity.this)
                .setTitle("Closing")
            .setMessage("Do you want to quit?")
            .setPositiveButton("Yes", dialogListener)
            .setNegativeButton("no", dialogListener)
            .create();
            break;
        }
        return dialog;
    }


    final DialogInterface.OnClickListener dialogListener = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    dialog.dismiss();
                    finish();
                break;
                case DialogInterface.BUTTON_NEGATIVE:
                    dialog.dismiss();
                break;  
            }
        }
    };
}

主要的.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button 
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Quit!"
        android:layout_marginTop="20dp"
        />

</LinearLayout>
于 2012-06-23T13:35:14.337 回答