2015-01-08 6 views
5

Va bene per creare un nuovo instace di Picasso per il caricamento di ogni image.For esempio qualcosa come:Va bene per creare nuova istanza di picasso ogni

Picasso.with(context) 
    .load(url) 
    .placeholder(R.drawable.placeholder) 
    .error(R.drawable.error) 
    .centerInside(
    .tag(context) 
    .into(holder.image); 

in getView() di un listAdaptor .Does non creare nuovo LruCache ogni volta che alla fine porterà a OOM.

Anche il Context può passò a Picasso può essere un Activity Context:

/** Start building a new {@link Picasso} instance. */ 
public Builder(Context context) { 
    if (context == null) { 
    throw new IllegalArgumentException("Context must not be null."); 
    } 
    this.context = context.getApplicationContext(); 
} 

risposta

11

Picasso è progettato per essere un singleton, quindi non c'è una nuova istanza creata ogni volta.

Questo è il metodo with():

public static Picasso with(Context context) { 
    if (singleton == null) { 
     synchronized (Picasso.class) { 
     if (singleton == null) { 
      singleton = new Builder(context).build(); 
     } 
     } 
    } 
    return singleton; 
} 

Si noti che si tratta di un metodo statico in modo che non si chiama with() su una particolare istanza, Picasso sta gestendo la propria istanza, che viene creato solo se è singletonnull.

Non c'è alcun problema con passando un Activity come contesto, perché il Builder userà l'ApplicationContext quali è un single, global Application object of the current process:

public Builder(Context context) { 
     if (context == null) { 
     throw new IllegalArgumentException("Context must not be null."); 
     } 
     this.context = context.getApplicationContext(); 
} 

quanto riguarda la cache, la stessa è usare ogni volta, dal momento che viene mantenuto by the singleton:

public Picasso build() { 
     // code removed for clarity 

     if (cache == null) { 
     cache = new LruCache(context); 
     } 
     // code removed for clarity 

     return new Picasso(context, dispatcher, cache, listener, transformer, requestHandlers, stats, 
      defaultBitmapConfig, indicatorsEnabled, loggingEnabled); 
} 
+0

Desidero sottolineare l'oggetto applicazione singolo, globale del processo corrente. Ciò significa che dovrai disporre di un'istanza di Picasso per ciascuno dei processi su cui viene eseguita la tua app. – Sebastiano

1
Its not problem..You are not creating Object 

Picasso è già SingleTon oggetto

Ecco il codice Souce Picasso Class

public static Picasso with(Context context) { 
    if (singleton == null) { 
     synchronized (Picasso.class) { 
      if (singleton == null) { 
       singleton = new Builder(context).build(); 
      } 
     } 
    } 
    return singleton; 
} 

Altro Codice sorgente a Picasso Source code

1

Kalyan ha ragione! Picasso è già un singleton, quindi utilizza la stessa istanza per tutte le immagini che carichi. Inoltre ciò significa che non avrai bisogno di quel costruttore. basta chiamare: "Picasso.with (context) .load (url) .into (holder.image);" con le impostazioni che vuoi e questo è tutto.