Что может привести к частичному декодированию Android ImageView?

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

проблема

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

аннотация

Если я поворачиваю свое устройство, что приводит к повторному запуску onCreate, ImageView отрисовывается правильно. Я использую библиотеку picasso для управления загрузкой и декодированием. Я проверил файловую систему на наличие самого файла, представляющего изображение, и файл в порядке и полностью загружен.

Кажется, я могу воспроизвести это поведение 1 из каждых 10 раз или около того, что достаточно, чтобы вызвать проблемы у моих пользователей.

Может ли кто-нибудь предположить, почему это может происходить? Устройство, на котором я воспроизвел, было Nexus 5 под управлением Android L, но я также видел это на устройстве коллеги под управлением Android KitKat на Samsung Galaxy 4.

Для справки, я использую picasso 2.4.0 (форк Picasso от 20 января 2015 года).


person esilver    schedule 08.02.2015    source источник
comment
список некоторых ошибок здесь --›github.com/square/picasso/issues/530 , если длина содержимого огромна, это может привести к неправильному поведению   -  person KOTIOS    schedule 08.02.2015
comment
Я просмотрел этот список, но не увидел ничего, что соответствовало бы моему опыту. Нить началась в середине прошлого года; надеюсь, мой форк будет включать исправления. Кроме того, нормально ли, что декодер декодирует только верхнюю часть любого изображения? Разве это не обычное предложение по принципу «все или ничего»?   -  person esilver    schedule 08.02.2015
comment
Что контролирует «стек» просмотров изображений? Есть ли у него «переработка» нижних 95% любой карты imgvw, которая не является верхней частью стека? Может ли он потерять местозаполнитель в представлении вверху и непреднамеренно перезапустить его, сделав его представление похожим на другие, которые были наложены более молодыми картами в стеке?   -  person Robert Rowntree    schedule 08.02.2015


Ответы (2)


При дальнейшем рассмотрении это был уместный комментарий из этой темы:

Я исправил с помощью приведенного ниже кода в NetworkRequestHandler.java... Когда сеть была сломана, я думаю, что она декодирует половину фотографии

Я смог воспроизвести эту проблему на 100%, когда на моем тестовом сервере я вернул подмножество изображения JPEG вместо всего изображения JPEG. Казалось бы, эта проблема возникает из-за разорванных HTTP-соединений (или плохих файловых серверов), которые возвращают только подмножество данных. Я использую пользовательскую сетевую библиотеку, которую подключаю к Picasso (вместо https://square.github.io/picasso/javadoc/com/squareup/picasso/OkHttpDownloader.html), и я просто модифицировал эту библиотеку, чтобы убедиться, что длина файла соответствует длине содержимого, сообщенной сервером, перед сохранением и декодированием файла.

person esilver    schedule 10.02.2015

Этот пост на Пикассо описывает то, что я испытал:

Я получаю половину фотографии и половину белого цвета, а иногда я получаю только белый цвет. #836

Один из комментаторов ветки говорит:

удалите атрибут android:scaleType и проверьте, существует ли ошибка... Обычно я не получаю эту ошибку, когда удаляю атрибут scaleType из пользовательского ImageView и использую надежный метод fit() в picasso.

Оказывается, на самом деле я включил атрибут «scaleType» для «centerCrop» в изображение, в которое я загружался. Я удалил этот атрибут в пользу .fit().centerCrop() и с тех пор не сталкивался с этой проблемой; обновлю эту тему, если я это сделаю.

person esilver    schedule 08.02.2015