我最近一直在玩毕加索作为图像加载器库.我和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帖子中读到应该使用应用程序上下文但没有提供更多细节.
所以作为结论,我的问题是: - 我们应该使用的上下文是什么,应该使用哪一个. - 为什么使用全局对象而不是活动级别实例.
谢谢!
我正面临Retrofit的一个问题,并希望找到一个合适的答案,因为我能想到它的唯一方法是非常丑陋而且不实用.
改进PATH注释在开头需要一个"/"(因为你可以读取从库源中提取的代码:
/** Loads {@link #requestUrl}, {@link #requestUrlParamNames}, and {@link #requestQuery}. */
private void parsePath(String path) {
if (path == null || path.length() == 0 || path.charAt(0) != '/') {
throw methodError("URL path \"%s\" must start with '/'.", path);
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是PATH部分来自响应对象的后端,这意味着所有PATH的字符串已经在之后的其他响应中从后端格式化,如下所示:
Object : {
href: "/resources/login..."
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当包含类似这样的内容时,URL会格式错误:
@GET("{/loginHref}")
void login(@EncodedPath("loginHref") String loginHref,
Callback<User> callback);
Run Code Online (Sandbox Code Playgroud)
类似于" http://mybaseurl.com//resources/login"*在资源面前加倍//
这肯定会导致某些端点出现问题,除了执行以下操作之外,我无法想出解决此问题的简单方法:
a)修改我自己的改造版本以删除该/字符检查(这是最后的手段)
b)在从界面使用该方法之前截断href(我不惜一切代价避免使用该方法,并且会在整个地方添加不必要的转换.
c)拦截请求并在发生此情况时正确形成URL(同样非常难看的解决方案).
有什么想法,建议?
谢谢!