我对图像下载有以下要求:
忽略SSL错误(是的我知道风险)
使用会话cookie
我尝试修改 Picasso 2.4.0 来做到这一点,下面是我的方法:
public static Picasso getPicasso(Context context) {
/* an OkHttpClient that ignores SSL errors */
final OkHttpClient client = getUnsafeOkHttpClient();
return new Picasso.Builder(context)
.downloader(new OkHttpDownloader(client) {
@Override
public Response load(Uri uri, boolean localCacheOnly) throws IOException {
final String RESPONSE_SOURCE_ANDROID = "X-Android-Response-Source";
final String RESPONSE_SOURCE_OKHTTP = "OkHttp-Response-Source";
HttpURLConnection connection = openConnection(uri);
connection.setRequestProperty("Cookie", getCookieHandler().
getCookieStore().getCookies().get(0).toString());
connection.setUseCaches(true);
if (localCacheOnly)
connection.setRequestProperty("Cache-Control", "only-if-cached,max-age=" + Integer.MAX_VALUE);
int responseCode = connection.getResponseCode();
if (responseCode == 401)
relogin();
else if (responseCode >= 300) {
connection.disconnect();
throw new ResponseException(responseCode + " " + connection.getResponseMessage());
}
String responseSource = connection.getHeaderField(RESPONSE_SOURCE_OKHTTP);
if (responseSource == null)
responseSource = connection.getHeaderField(RESPONSE_SOURCE_ANDROID);
long contentLength = connection.getHeaderFieldInt("Content-Length", -1);
boolean fromCache = parseResponseSourceHeader(responseSource);
return new Response(connection.getInputStream(), fromCache, contentLength);
}
}).build();
}
我从原始来源更改的唯一内容是为Cookie
添加HttpURLConnection
。我还复制了(未更改)parseResponseSourceHeader()
方法,因为它具有私有访问权。
请注意,给定here的方法不起作用(响应代码401)。
图像加载基本上有效,但存在一些主要问题:
fromCache
始终为false
,Picasso
始终重新加载已下载的图片。contentLength
始终为-1 ImageView
)时RAM使用率会增加,似乎Bitmap
对象仍然存在于内存中BaseAdapter
的{{1}}内使用时,似乎GridView
尝试加载所有(或至少与Picasso
被调用的次数一样多)图像同时。这些图像出现,然后应用程序冻结并关闭以下(OOM?)日志: getView()
或
A/Looper﹕ Could not create wake pipe. errno=24
如果我使用仅 A/Looper﹕ Could not create epoll instance. errno=24
的自定义Target
,则会出现所描述的问题。
似乎我通过覆盖ImageView
的{{1}}方法打破了毕加索的一些机制,但是由于我做了很少的改动,所以我没有弄错。任何建议都表示赞赏。
答案 0 :(得分:0)
如果有人有类似的问题:这是我的一个非常蹩脚的错误。我正在创建多个Picasso
实例,这完全是胡说八道。确保带有辅助类的单例模式返回单个Picasso
实例后,一切都按预期工作。