Утечка в окне даже в dialog.dismiss ()

1

Я использую этот код:

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): Activity com.amateurprogs.championpkg.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41768940 that was originally added here
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowLeaked: Activity com.amateurprogs.championpkg.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41768940 that was originally added here
06-23 18:32:25.230: E/WindowManager(532):   at android.view.ViewRootImpl.(ViewRootImpl.java:344)
06-23 18:32:25.230: E/WindowManager(532):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
06-23 18:32:25.230: E/WindowManager(532):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
06-23 18:32:25.230: E/WindowManager(532):   at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
06-23 18:32:25.230: E/WindowManager(532):   at android.view.Window$LocalWindowManager.addView(Window.java:537)
06-23 18:32:25.230: E/WindowManager(532):   at android.app.Dialog.show(Dialog.java:278)
06-23 18:32:25.230: E/WindowManager(532):   at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
06-23 18:32:25.230: E/WindowManager(532):   at com.amateurprogs.championpkg.MainActivity$2.run(MainActivity.java:42)

Строка 42 MainActivity.java относится к builder.show().

При выборе кнопки "Выход", я делаю dialog.dismiss(), а затем Activity.finish(). Тем не менее я получаю утечку окна.

Почему я получаю эту ошибку даже на dialog.dismiss().

  • 0
    Вы поместили свою ошибку в окно поиска Google ...
Теги:
dialog

3 ответа

0

Вам нужно onPause() диалог в onPause() или onDestroy()

0

Спасибо, что ответили на мой вопрос. На самом деле, я вызываю Close() из класса non-activity, следовательно, runOnUiThread(). Я ожидал, что dialog.dismiss() будет выполнять свою работу до того, как будет вызвана функция.finish(). В любом случае я буду использовать dialog.builder.create() и попробую ваше решение.

0

Итак, сначала ваш код грязный. Нет причин для OnClickListener метода listener to 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;  
            }
        }
    };
}

main.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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню