2012-01-11 12 views
4

Storing a Bitmap resource in a static variableをフォローアップすると、android.graphics.Bitmapの静的リファレンスをViewに格納すると、それをインスタンス化した最初のViewへの参照がリークする可能性があります。 Androidでこれを解決するための慣習的な方法は何ですか?このビューのインスタンスがインスタンス化されるたびにBitmapFactory.decodeResource(resource, id)に電話する必要はありません。これは、1つのアクティビティごとに(何度も)実行されるためです。私はこの小さいBitmapを常にメモリに残しておきたい。だから、以下を行う正しい方法は何ですか:ビットマップをメモリに保持する方法

public class MyView extends View { 
    private static Bitmap star; 
    public MyView(Context context) { 
     synchronized(this) { 
      if (star == null) { 
       star = BitmapFactory.decodeResource(getResources(), R.drawable.star); 
      } 
     } 
    } 
    // ... 
} 

答えて

3

アクティビティの()から呼び出す静的なクリーンアップメソッドをビューに作成します。その呼び出しでは、ビットマップのrecycle()を呼び出し、参照をクリアします。同様に、コンストラクタにビットマップを作成する代わりに、アクティビティのonResume()で呼び出す初期化呼び出しを行います。

ビューがアクティビティ全体で使用されているため重複が懸念される場合は、カウントが0になったときにのみビットマップが破棄されるように、initおよびclean-up呼び出しで参照カウントを維持できますビットマップが十分に小さい場合は、onCreate()/onDestroy()と考えることもできます。

ビュークラスのビットマップ参照で、nullを使用する前に必ず確認してください。

+0

ビットマップをアプリケーションクラスに入れると、参照をクリアする必要がありますか? – Kostadin

0

私はフィールドが静的であることに気付きました。コンストラクターに静的フィールドを設定する必要があります。フィールドを設定する静的メソッドを呼び出すことをお勧めします。

静的メソッドを同期させることができます。


コンストラクタは常にスレッドセーフであるため、synchronizedまたはcheck for nullを使用する必要はありません。あなただけのフィールドを設定(およびそれfinal作る)ことができます

+1

私はOPのコードで 'star'が' static'であるのを見逃したかもしれないと思います。 –

0

理由だけ

ビューにビューが可能とビットマップを渡す活動にイメージをロードしたり、アプリケーション全体の上にそれをやっている場合ではありませんアプリケーションコンテキストを使用してイメージをロードします。

関連する問題