0

私はクラスを持っています:

class RenderView implements Runnable {
   Thread renderThread;
   public void  run() {
        while(!Thread.currentThread().isInterrupted()) {
            //does some work
        }
} 

//At some point in executed code, inside RenderView class (i'm sure it's executed)
renderThread = new Thread (this);

//When activity is closed (also, i'm sure this part is executed)
renderThread.interrupt();

そして、renderThread は実際に停止します (少なくとも、run() メソッドは終了します)。

しかし、何らかの理由で、アクティビティを終了した後も、コード内に renderView への参照が残っています。これは私に巨大なメモリリークを引き起こしています。

そして、hprof ダンプは次のことを教えてくれます: java.lang.Thread (これは GC ルートにあります) にはターゲット (mypackage.RenderView) への参照があります

Thread は既に終了しているのに、この Thread クラスが Thread への参照を保持している理由がわかりません。何か案は?

EDIT : renderView は、たとえば、アクティビティ B で参照されます。そのため、アクティビティを終了しても、renderThread への参照にはまだ到達できないはずです。しかし、まだ renderThread = null を設定しようとしました: 動作しません。MAT アナライザーで確認できたように、renderView がガベージ コレクションされないようにする唯一のものは、java.lang.Thread からのこの堰参照です。

MAT アナライザーのスクリーンショット

4

4 に答える 4

2

AsyncTask または runOnUIThread() を使用しないのはなぜですか?

あなたがしていることの必要性を見たことがありません。おそらくあるかもしれませんが、それ以外の場合は、AsyncTask または runOnUIThread を使用してください。車輪を再発明しないでください。

于 2012-07-20T23:52:24.740 に答える
1

スレッドインスタンスを解放します

renderThread = null;

スレッド インスタンスは、他のインスタンスと同様に、オブジェクトです。実行が終了しても、解放するまで参照を保持します。

于 2012-07-20T23:56:35.720 に答える
0

実際には、renderThread.interrupt はスレッドを停止しない場合があります。これはフラグを設定し、中断できることを JVM に通知するだけです。そのため、スレッドがまだ実行されている可能性があります。 while ループでフラグを立てます。

    while(isRunning){

    }

// at some point, say 

    isRunning = false;

Android UI 設計のベスト プラクティスは、次のリンクから入手できます。

Android UI のデザイン パターン:

于 2012-07-21T03:29:20.670 に答える
0

無効化しようとしましたrenderThreadか?

于 2012-07-20T23:53:53.057 に答える