2012-04-13 21 views
9

Androidはアプリケーションの描画可能なリソースのメモリキャッシュを保持して再利用しますか、別のウィジェットに動的に割り当てることができるすべてのドロアブルをプリロードすることをお勧めしますか?例えばリソースからdrawableをプリロードする理由はありますか?

public static final int[] SETS = { 
     R.drawable.set0, R.drawable.set1, R.drawable.set2, 
     R.drawable.set3, R.drawable.set4, R.drawable.set5, R.drawable.set6, 
     R.drawable.set7, R.drawable.set8, R.drawable.set9, R.drawable.set10}; 
public Drawable[] sets; 

void init() { 
    load(sets, SETS); 
} 

public void load(Drawable[] d, int[] ids) { 
    for (int i = 0; i < ids.length; i++) { 
     if (ids[i] == 0) 
      d[i] = null; 
     else 
      d[i] = context.getResources().getDrawable(ids[i]); 
    } 
} 

答えて

9

これは、不必要な最適化前のようなにおいがします。しかし、アンドロイドはドロアブルをキャッシュしておくので、あらかじめロードする必要はありません。関連するコードApplicationContext

/*package*/ Drawable loadDrawable(TypedValue value, int id) 
      throws NotFoundException { 
     . 
     . 
     . 

     final long key = (((long) value.assetCookie) << 32) | value.data; 
     Drawable dr = getCachedDrawable(key); 

     if (dr != null) { 
      return dr; 
     } 

     . 
     . 
     . 

     if (dr != null) { 
      dr.setChangingConfigurations(value.changingConfigurations); 
      cs = dr.getConstantState(); 
      if (cs != null) { 
       if (mPreloading) { 
        sPreloadedDrawables.put(key, cs); 
       } else { 
        synchronized (mTmpValue) { 
         //Log.i(TAG, "Saving cached drawable @ #" + 
         //  Integer.toHexString(key.intValue()) 
         //  + " in " + this + ": " + cs); 
         mDrawableCache.put(key, new WeakReference<Drawable.ConstantState>(cs)); 
        } 
       } 
      } 
     } 

     return dr; 
    } 

    private Drawable getCachedDrawable(long key) { 
     synchronized (mTmpValue) { 
      WeakReference<Drawable.ConstantState> wr = mDrawableCache.get(key); 
      if (wr != null) { // we have the key 
       Drawable.ConstantState entry = wr.get(); 
       if (entry != null) { 
        //Log.i(TAG, "Returning cached drawable @ #" + 
        //  Integer.toHexString(((Integer)key).intValue()) 
        //  + " in " + this + ": " + entry); 
        return entry.newDrawable(this); 
       } 
       else { // our entry has been purged 
        mDrawableCache.delete(key); 
       } 
      } 
     } 
     return null; 
    } 
+1

キャッシングをオフにする方法はありますか?私は単一drawableを数回取得し、その陰影を変更しています。彼らはすべて同じ色合いに終わる。非常にイライラ。 – astryk

+0

そのため、drawableにmutate()があります – headsvk

関連する問題