2012-03-21 3 views
0

私のライブラリコードはバイト配列をUIに通知します。UIはキューに入れられます。他のスレッドはバイト配列をデキューし、ハンドラのインスタンスを使用してバイト配列をバンドルし、メッセージを送信してUIを更新します。ハンドラのメモリリークを回避する方法は?

UI

public void run(){ 

     while(running){ 
      try { 
       byte[] msg=(byte[]) queue.getMsg(); 
       Message message=new Message(); 
       Bundle bundle=new Bundle(); 
       bundle.putByteArray("img",msg); 
       message.obj=bundle; 
       handler.sendMessage(message); 
       message=null; 


      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

を更新するためのハンドラを使用しますが、事は、私は5〜10分後にOutOfMemory例外を取得しています。コードスニペットは、 Eclipse MATヒープ・ダンプを使用すると、ヒープの90%がandroid.os.Messageのインスタンスが占有していることがわかります。

答えて

5

毎回新しいMessageを作成しています。これはおそらくあなたの問題につながるものです。あなたがやるべきことは使用HandlerMessageプールからMessageを取得している:

Message message = handler.obtainMessage(); 

これは、すべてその新しいメモリを割り当てるからあなたを維持します。

関連する問題