每次都可以创建新的毕加索实例

时间:2015-01-08 10:00:05

标签: android out-of-memory picasso

是否可以创建一个新的毕加索实例来加载每个图像。例如:

Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .centerInside(
    .tag(context)
    .into(holder.image);
<{1>} getView()中的listAdaptor。是否每次都会创建新的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();
}

3 个答案:

答案 0 :(得分: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(),Picasso正在管理自己的实例,该实例仅在singletonnull时创建。

传递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);
}

答案 1 :(得分:1)

Its not problem..You are not creating Object 

Picasso已经是SingleTon对象

这是源代码Picasso Class

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

的更多源代码

答案 2 :(得分:1)

Kalyan是对的!毕加索已经是一个单身人士,因此它为你加载的所有图像使用相同的实例。这也意味着您不需要该构建器。你只需致电: “Picasso.with(上下文).load(URL).into(holder.image);”使用您想要的设置,这就是全部。