2012-04-13 13 views
9

¿Mantiene Android una memoria caché de los recursos dibujables de la aplicación y los reutiliza, o es una buena práctica precargar todos los elementos extraíbles que pueden asignarse dinámicamente a diferentes widgets?¿Hay alguna razón para precargar encajables de los recursos?

Por ejemplo:

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

Respuesta

9

Esto huele a un pre-optimización innecesaria. Sin embargo, Android almacena cacheados de forma que no tenga que cargarlos previamente. Código relevante de 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

¿Hay alguna manera de desactivar el almacenamiento en caché? Estoy obteniendo un único dibujo varias veces y alterando su sombreado. Todos terminan con el mismo tono. Muy frustrante. – astryk

+0

es por eso que hay mutate() en dibujables ... – headsvk

Cuestiones relacionadas