2015-01-14 2 views
2

У меня есть следующие требования для загрузки изображения:Пикассо работает неправильно после перекрывая OkHttpDownloader.load()

  • ошибки, игнорируя SSL (да, я знаю о рисках)

  • , используя куки сессии

Я пытался адаптировать Пикассо 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 всегда перегружает образ, который уже загружен)
  • там нет Заголовок Content-Length, поэтому contentLength всегда -1
  • , хотя кеш не работает, использование ОЗУ увеличивается при загрузке следующего изображения (точно так же или любого другого ImageView), кажется, что е Bitmap объект находится где-то в памяти
  • при использовании внутри BaseAdapter в виде GridView, кажется, что Picasso пытается загрузить все (или, по крайней мере, столько, сколько, сколько раз getView() называли) изображения одновременно. появляются эти изображения, то приложение зависает и закрывается с помощью следующего входа (ООМ):

A/Looper﹕ Could not create wake pipe. errno=24

или

A/Looper﹕ Could not create epoll instance. errno=24 

Описанные проблемы возникают независимо от того, если я использую пользовательский Target всего лишь ImageView.

Похоже, что я нарушил некоторые механизмы Пикассо, переопределив метод load()OkHttpDownloader, но я не понимаю, что случилось, так как я внес минимальные изменения. Любые предложения приветствуются.

ответ

0

В случае, если у кого-то есть аналогичная проблема: это была моя ошибка. Я создавал несколько экземпляров Picasso, что является полным бессмыслицей. После обеспечения одноэлементного шаблона со вспомогательным классом, который возвращает один экземпляр Picasso, все работает по назначению.

Смежные вопросы