我最近一直在玩毕加索作为图像加载器库。我和Dagger以及OkHtttp一起使用它。
我对这个库的唯一问题是上下文的使用以及通过构建器实现库的实例化。
我不完全确定所需的上下文是什么(无法找到有关它的文档)以及我们应该使用哪个上下文(ApplicationContext或ActivityContext?)以及原因。
查看示例(btw伟大的示例应用程序以查看所有这些组合)u2020由Jake Wharton,只有一个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;
}
这用作全局对象,仅实例化一次。我的问题是为什么不在Activity级别实例化一个新的picasso实例(使用相同的全局OkHttpClient配置LRUCache并且之前注入它)并将活动作为上下文传递?我今天早上在一个Github Picasso帖子中读到应该使用应用程序上下文但没有提供更多细节。
作为结论,我的问题是: - 我们应该使用的上下文是什么以及应该使用哪个上下文。 - 为什么使用全局对象而不是活动级别实例。
谢谢!
答案 0 :(得分:10)
使用默认的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();
}
复制的存根
如果您确实想在每个活动中创建 new 实例:
对于您创建的Picasso的每个实例,您基本上都会创建一个新缓存:第一个实例中缓存的图像将不会在第二个实例中重用。你很可能会遇到OutOfMemoryException
,因为毕加索没有处理这个问题。