У меня есть следующие требования для загрузки изображения:Пикассо работает неправильно после перекрывая 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
, но я не понимаю, что случилось, так как я внес минимальные изменения. Любые предложения приветствуются.