/var/log/messages

debugging with sixth sense

リークしちゃいましたの巻

戻るキーの押下を dispatchKeyEvent で掴まえててダイアログ出して OK なら finish とかってヤッてたんですがある条件で動きっぱになってる以下みたいな Handler なオブジェクトがおりまして、見事にリークしてました。

    protected Runnable mSCEngine = new Runnable() {

        @Override
        public void run() {
            HogePlayKickoff();
        }

    };

    protected void HogePlayKickoff() {
        Log.d(TAG, "HogePlayKickoff");

        HogeInitialize();
        if (isContinue) {
            mHandler.postDelayed(mSCEngine, CYCLE);
        } else {
            HogeStop();
        }
    }

見たら分かると思うんですが、isContinue な状態で kickoff しちゃうと CYCLE な間隔で定期的に実行されるのですが finish しちゃうと mHandler な参照も初期化されてしまって、そのプロセスなオブジェクトが生きている間は leak した Handler オブジェクトがひたすらに動き続ける、という非常に微妙な状況になってしまった訳です。

Android なプログラムの状態遷移

finish() を呼び出すと即座に onDestroy されてしまい、プロセスとしては残っているけれど、クラスの属性というか変数の参照は初期化されてしまうのですね。また、プロセスを強制終了させないと leak して動きっぱな Handler オブジェクトは死なないようです。

ここまで控えて思いついたことがあるので

関係方面に連絡を。しかしこんな控えを今更残すことになるとはorz

Comments