2012-01-11 30 views
4

跟在Storing a Bitmap resource in a static variable後面,似乎在View中存儲對android.graphics.Bitmap的靜態引用可能會泄漏對實例化該對象的第一個View的引用。在Android中解決這個問題的習慣用法是什麼?每次此視圖的實例被實例化時,我都不想調用BitmapFactory.decodeResource(resource, id),因爲這將在每個單獨的活動中完成(很多次)。我希望這個小的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()中調用一個初始化調用。

如果您有任何擔心可能會有重疊,因爲您的視圖跨活動使用,則可以讓init和清理調用保持引用計數,以便只在計數達到0時銷燬位圖。如果位圖足夠小,您也可以考慮使用onCreate()/onDestroy()

在使用它之前一定要檢查視圖類中的位圖引用爲null。

+0

如果我將位圖放在應用程序類中 - 是否必須清除引用? – Kostadin 2012-04-03 06:47:28

0

我只注意到這個字段是靜態的。你應該在構造函數中設置一個靜態字段,因爲這很簡單。我建議你有一個被稱爲的靜態方法,它設置字段。

您可以使靜態方法同步。


構造函數始終是線程安全的,因此您不需要使用synchronized或檢查null。你可以只設置字段(並使其final

+1

我想你可能錯過了OP的代碼中'star'是'static'。 – 2012-01-11 17:46:11

0

爲什麼不直接加載圖像中的活動,其中的意見會和位圖傳遞到的意見

,或者如果你這樣做,在整個應用程序,使用應用程序上下文來加載圖像。

相關問題