2012-04-13 13 views
9

Behält Android einen Speichercache für auslagerbare Anwendungsressourcen bei und verwendet sie erneut, oder empfiehlt es sich, alle Zeichnungsobjekte vorab zu laden, die dynamisch verschiedenen Widgets zugewiesen werden können?Gibt es einen Grund, Zeichen aus Ressourcen vorzuladen?

Zum Beispiel:

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

Antwort

9

Das riecht wie ein unnötiger Voroptimierung. Allerdings zeichnet Android Cache-Zeichen, so dass Sie sie nicht vorab laden müssen. Relevanter Code von 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

Gibt es eine Möglichkeit, die Zwischenspeicherung zu deaktivieren? Ich bekomme mehrmals eine einzige Zeichnung und ändere ihre Schattierung. Sie alle haben die gleiche Farbe. Sehr frustrierend. – astryk

+0

Deshalb gibt es mutate() auf drawables ... – headsvk

Verwandte Themen