2011年7月20日水曜日

ダイアログ表示で、Window Leaked(メモリリーク)

開発環境:
Windows Vista Home
eclipse 3.5(ガリレオ)
ADT_今日の時点で最新の物(バージョン不明)
JavaSDK 1.6.0_24
AndroidSDK_r11
開発・ターゲットVer=Android2.1


テスト環境:
媒体 = エミュレータ
↑SDK ManagerでVer2.1のHVGAで作成


普通にダイアログを表示しようとした所、Exception「Window Leaked」と言われた。


・最初に書いたコード

@Override
public void onCreate(Bundle savedInstanceState) {
    // 表示項目の配列
    final String[] colors = { "RED", "BLUE", "YELLOW" };
    // タイトルを設定
    alertDialogBuilder.setTitle("タイトル");
    // 表示項目とリスナの設定
    alertDialogBuilder.setItems(colors,
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 項目が選択されたときの処理
            }
        }
    );

    // ダイアログを表示
    alertDialogBuilder.create().show();
}


調べたらライフサイクルの管理の問題の可能性が高い事が分かった。

上記の方法はライフサイクルを自前で管理する方法。

Android側に管理させる方法を取らないと難しいかもしれない。


・Android側に管理させる方法

@Override
public void onCreate(Bundle savedInstanceState) {
    // 引数は何でもいい。onCreateDialogメソッドに渡っていくだけ。
    showDialog(0);
}

@Override
protected Dialog onCreateDialog(int id) {
    return createDialog(id);
}

/**
 * ダイアログ生成
 * @param id
 * @return
 */
private Dialog createDialog(int id) {
    if (id == DIALOG_ID_ABESHI) {
        // 表示項目の配列
        final String[] colors = { "RED", "BLUE", "YELLOW" };
        // タイトルを設定
        alertDialogBuilder.setTitle("タイトル");
        // 表示項目とリスナの設定
        alertDialogBuilder.setItems(colors,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // 項目が選択されたときの処理
                }
            }
        );

        return alertDialogBuilder.create();
    }
    return null;
}


まず「showDialog」メソッドを実行する。

すると、ダイアログ作成イベントが走り、onCreateDialog」が実行される。

こうする事でAndroid側に管理させる事になるようだ。

   ↓クリックで、このブログの評価が上がり執筆者が喜びます
にほんブログ村 IT技術ブログ プログラム・プログラマーへ
   にほんブログ村

0 件のコメント: