2015-01-08 5 views
5

Можно ли создать новый instace из Picasso для загрузки каждого image.For Eg что-то вроде:Можно ли создать новый экземпляр Picasso каждый раз

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

в getView() из listAdaptor через .Does не создают новый LruCache каждый раз, что в конечном итоге приведет к OOM.

Также может Context передан Пикассо может быть 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(); 
} 

ответ

11

Picasso разработан как одноэлементный, поэтому каждый новый экземпляр создается не каждый раз.

Это with() метод:

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

Обратите внимание, что это статический метод, так что вы не называйте with() на конкретный примере, Пикассо управляют своим собственным экземпляром, который создается только если singleton является null.

Там нет проблем с пропусканием Activity как контекст, так как Builder будет использовать ApplicationContext, который является 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(); 
} 

Что касается кэша, то же один, это использовать каждый раз, так как она сохраняется по оконечному устройству:

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

Я хочу подчеркнуть «единый глобальный объект приложения текущего процесса». Это означает, что вам понадобится один экземпляр Picasso для каждого из процессов, над которыми работает ваше приложение. – Sebastiano

1
Its not problem..You are not creating Object 

Picasso уже SingleTon Объект

Вот код Souce Пикассо Класс

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

Подробнее Исходный код на Picasso Source code

1

Калян прав! Picasso уже является одноэлементным, поэтому он использует один и тот же экземпляр для всех загружаемых изображений. Также это означает, что вам не понадобится этот строитель. вы просто вызываете: «Picasso.with (context) .load (url) .into (holder.image);" с настройками, которые вы хотите, и это все.

Смежные вопросы