2011-06-10 9 views
2

いくつかのオブジェクトを表示するために多くのサーフェスビューインスタンスを作成していますが、一度に1つのインスタンスが作成されてからsurfaceDestroyedが呼び出されます。 surfacecreatedで毎回作成しているスレッドは、メインのThreadGroupに追加されています。新しいスレッドを作成するたびにメインスレッドグループに追加される

私は中断して無効にしていますが、依然としてメインThreadGroupに存在し、メモリ不足例外が発生しています。

コードスニペット: コンストラクタ

public class MsurfaceView extends SurfaceView implements 
     SurfaceHolder.Callback { 
_thread = new mThread(this); 
    _thread.setName("mThread"); 


@Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     if (!_thread.isAlive()) { 
      _thread = new BreedingThread(this); 
     } 

     _thread.setRunning(true); 
     _thread.start(); 

    } 





@Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.d("mThread", "Surface Destroyed Called"); 
     getHolder().removeCallback(this); 
     getHolder().addCallback(null); 

     boolean retry = true; 
     _thread.setRunning(false); 

     while (retry) { 
      try { 
       _thread.interrupt(); 
       _thread.getThreadGroup().interrupt(); 
       _thread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       Log.d("mThread", "Interrupted"); 
       // pass interrupt exception 
       Thread.currentThread().interrupt(); 
       Log.d("mThread", "b4 threadGroupInterrupted"); 
       _thread.getThreadGroup().interrupt(); 
       _thread.getThreadGroup().list();//this shows thread is in //list 
       _thread = null; 
       break; 
      } 
     } 
    } 

UPDATE Thread.list機能は、私が中断することを示しているとヌルスレッドがどのようにそれらを削除するスレッドグループ

06-10 15:22:52.780: INFO/System.out(1814): java.lang.ThreadGroup[name=main,maxPriority=10] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[main,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Binder Thread #1,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Binder Thread #2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[FlurryAgent,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[AsyncTask #1,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[AsyncTask #2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-17,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-38,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Timer-2,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-53,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-286,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-327,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-359,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[mThread,5,main] 
06-10 15:22:52.780: INFO/System.out(1814):  Thread[Thread-409,5,main] 

にまだありますか?

+0

コードが完全ではありません。理解のためのコードスニペットだけです。私はこのサーフェイスビューを作成しています。このスレッドは1つが破棄された後に作成されています –

+0

あなたの他のスレッドで言ったように。削除する必要はなく、削除しないでください。代わりに、スレッドが終了し、それらを参照していないようにコードを修正する必要があります。 – Kaj

+0

hProf解析では、主ThreadGroupのみが自分のBreedingThreadを参照していることがわかります –

答えて

1

いくつかのものを探します。

  1. catchブロック内で_thread = nullを呼び出しているだけです。つまり、例外がスローされない場合はnullに設定されません。それをfinallyブロックの中に移動します。
  2. 例外はおそらくスローされません。 Thread.interrupt()を呼び出してもスローされません。これは、スレッドの割り込みフラグをtrueに設定します。ループ全体がかなり奇妙なので、おそらくそれを書き直すべきです。
  3. このインスタンスをBreedingThreadに渡しています。オブジェクトがあなたのサーフェスビューへの参照を永遠に保持していないことを確認してください
  4. サーフェイスビューのdestroyメソッドを呼び出すだけでは、参照が保持されているとは限りません。
+0

ログはそのスレッドが中断されていることを表示します。 hprofをメモリアナライザで使用し、breedingThreadがメモリオーバーフローの混乱を引き起こし、サーフェイスビューのすべてのインスタンスがメモリから削除されたことを示しています。私はtankingしている_thread = null;最後に。 thnx助けてください –

0

「新しいスレッド」を呼び出してグループを指定しないと、スレッドは呼び出し元と同じグループに追加されます(つまり、Thread.currentThread().getThreadGroup())。あなたのケースでは、それがあなたのスレッドを「メイン」スレッドグループに追加する原因になります。その動作を変更するには、new Thread(group, this)を使用してグループを指定します。

関連する問題