2012-04-13 13 views
9

Android conserva una memoria cache delle risorse disegnabili dell'applicazione e le riutilizza, oppure è buona norma precaricare tutti i drawable che possono essere assegnati dinamicamente a diversi widget?C'è qualche motivo per precaricare i drawable dalle risorse?

Per esempio:

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]); 
    } 
} 

risposta

9

Questa puzza come un inutile pre-ottimizzazione. Tuttavia, Android memorizza i drawable nella cache in modo da non doverli precaricare. Codice rilevante da 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

C'è un modo per disattivare la memorizzazione nella cache? Sto ottenendo un singolo drawable diverse volte e modificando la sua ombreggiatura. Finiscono tutti con la stessa tonalità. Molto frustrante. – astryk

+0

ecco perché c'è mutate() nei drawable ... – headsvk

Problemi correlati