2012-02-12 6 views
0

私は1つの質問があります。私はサイトですばやく検索しましたが、答えは見つかりませんでした。 Android 2.2以降を実行するアプリケーションを開発します。ビューのカスタマイズのために我々は、このような方法で使用される多くのDrawableを、使用します。私たちは、使用androidのdrawablesリソース管理

<LinearLayout ... 
    android:background="@drawable/some_drawable"/> 

もマッピングし、メモリ内の多くのデータを操作し、我々のアプリは重いを得ました。一番上のデバイスではうまくいきますが、アプリケーションを使用して数分後にOutOfMemory例外が発生しました。メモリリークが発生したように見えます。 私は、私たちのアプリのメモリ使用量を減らそうとしています。質問、私たちは、私たちの活動を破壊する上で手作業で掃除資源を必要としますか?

+0

高解像度のビットマップ/ドロワーブルを大量に使用すると、スケーリングされるため、多くのメモリが消費されます。特定の活動でこの問題はありますか?おそらくあなたはそこにたくさんのビットマップを持つリストビューを提示するでしょうか? –

答えて

3

私のアプリでもこの問題が発生しました。 OutOfMemoryErrorは、多くのビットマップがスケーリングやその他のビットマップ操作でアクティビティで使用された場合にスローされます。私が行ったことは、以下のコードを自分のアクティビティに追加しました。これは、問題が少なくなるように見えるようになっています(それはうまくいきませんでした)。そして、アプリケーションは合理的にローエンドのハンドセットでエラーなしで実行されます。

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    // explicitly release media player 
    if(viewObjectInfo != null) 
     viewObjectInfo.releaseMediaPlayer(); 
    //explicitly release all drawables and call GC 
    unbindDrawables(findViewById(R.id.main)); 
    System.gc(); 
} 

/** 
* Unbinds all drawables in a given view (and its child tree). 
* 
* @param findViewById  Root view of the tree to unbind 
*/ 
private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 

    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     try 
     { 
      ((ViewGroup) view).removeAllViews(); 
     } 
     catch(UnsupportedOperationException ignore) 
     { 
      //if can't remove all view (e.g. adapter view) - no problem 
     } 
    } 
} 
+0

'unbindDrawables(findViewById(R.id.main));'は、 'unbindDrawables(findViewById(R.layout.main));'になります。 – Si8

+0

レイアウトからすべてのイメージのバインドを解除して、レイアウトを再度呼び出すまでリソースを解放したい場合はどうすればよいですか? – Si8

+0

@ SiKni8あなたの最初のコメントに、私は 'R.id.main'でそれを持っていました - レイアウトではなく、ビューを取得しています - レイアウトはうまくいくかもしれませんが。あなたの2番目のものには、すべてをアンバインドしないでください - それはどのタイプのビューであるかを確認してください。 –

関連する問題