重写OkHttpDownloader.load()后毕加索工作不正确

时间:2015-01-14 12:35:42

标签: android picasso

我对图像下载有以下要求:

  • 忽略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始终为falsePicasso始终重新加载已下载的图片。
  • 没有“Content-Length”标头,因此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}}方法打破了毕加索的一些机制,但是由于我做了很少的改动,所以我没有弄错。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:0)

如果有人有类似的问题:这是我的一个非常蹩脚的错误。我正在创建多个Picasso实例,这完全是胡说八道。确保带有辅助类的单例模式返回单个Picasso实例后,一切都按预期工作。