毕加索和背景

Jat*_*ago 12 android picasso

我最近一直在玩毕加索作为图像加载器库.我和Dagger以及OkHtttp一起使用它.

我对这个库的唯一问题是上下文的使用以及通过构建器实现库的实例化.

我不完全确定所需的上下文是什么(无法​​找到有关它的文档)以及我们应该使用哪个上下文(ApplicationContext或ActivityContext?)以及原因.

通过Jake Wharton查看示例(顺便说一下这个组合所有这些的优秀示例应用程序)u2020,只有一个Picasso实例,它是在应用程序上下文的基础上创建的.像这样的东西:

@Provides
    @Singleton
    Picasso providePicasso(@ApplicationContext Context context, OkHttpClient client) {
        Picasso picasso = new Picasso.Builder(context)
                .downloader(new OkHttpDownloader(client))
                .listener(new Picasso.Listener() {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
                        Log.e("Picasso", "Failed to load image:" + uri);
                    }
                })
                .build();

        return picasso;
    } 
Run Code Online (Sandbox Code Playgroud)

这用作全局对象,仅实例化一次.我的问题是为什么不在Activity级别实例化一个新的picasso实例(使用相同的全局OkHttpClient配置LRUCache并且之前注入它)并将活动作为上下文传递?我今天早上在一个Github Picasso帖子中读到应该使用应用程序上下文但没有提供更多细节.

所以作为结论,我的问题是: - 我们应该使用的上下文是什么,应该使用哪一个. - 为什么使用全局对象而不是活动级别实例.

谢谢!

nha*_*man 11

使用默认Picasso.with(Context)方法时,选择哪个并不重要,或者Builder它将Context从给定的应用程序中检索应用程序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();
}
Run Code Online (Sandbox Code Playgroud)

Stub从Picasso.java #Builder中复制.


如果您确实想在每个活动中创建一个实例:对于您创建的每个Picasso实例,您基本上都会创建一个新缓存:第一个实例中缓存的图像将不会在第二个实例中重用.你很可能会碰到OutOfMemoryException这里,因为毕加索没有处理这个问题.

  • 并且可以说比单独的缓存更糟糕的是一个单独的调度程序线程和单独的工作线程.使用多个Picasso实例可能会浪费大量资源,因此请谨慎使用(或根本不使用).它被设计用作单身人士. (7认同)