Fresco: отображать неправильное изображение в элементах списка

Я использую библиотеку fersco для загрузки локального изображения. Первоначально я показываю изображение-заполнитель в каждом элементе. После загрузки изображения я сохраняю это изображение по локальному пути, а затем загружаю изображение с помощью функции setImageUri. Если я прокручиваю быстро во время загрузки изображения, оно отображает другое изображение и снова появляется некоторое время, продолжая меняться, если я прекращаю прокрутку.

Мой SimpleDraweeView:

<com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/fake_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
           android:layout_gravity="center|center_horizontal|center_vertical"
            android:adjustViewBounds="true"
            android:contentDescription="@string/app_name"
            android:scaleType="centerInside" /> 

Мой код адаптера:

GenericDraweeHierarchy hierarchy = setHierarchyForDraweeView(mImageView, 300);

иерархия.setFailureImage(mContext.getResources().getDrawable(R.drawable.broken_image_black)); mSimpleDraweeView.setImageURI(Uri.fromFile(новый файл(mPath/локальный путь/)));

Функция SetHierarchyForDraweeView:

private GenericDraweeHierarchy setHierarchyForDraweeView(SimpleDraweeView draweeView, int duration) {
    if (draweeView != null) {
        if (draweeView.getHierarchy() == null) {
            GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(mContext.getResources());
            GenericDraweeHierarchy hierarchy = builder
                    .setFadeDuration(duration)
                    .setPlaceholderImage(new AsyncColorDrawable(mContext.getResources()))
                    .setFailureImage(mContext.getResources().getDrawable(R.drawable.broken_image_black))
                    .build();
            draweeView.setHierarchy(hierarchy);
        } else {
            GenericDraweeHierarchy hierarchy = draweeView.getHierarchy();
            hierarchy.setFadeDuration(duration);
            return hierarchy;
        }
    }
    return null;
}

Класс AsyncColorDrawable:

private class AsyncColorDrawable extends ColorDrawable {
    public AsyncColorDrawable(Resources res) {
        super(res.getColor(R.color.RED));
    }
}

Я делаю что-то не так?


person Arun    schedule 25.02.2016    source источник
comment
Я вижу несколько вещей, которые следует исправить, но ни одна из них не объясняет некорректную загрузку.   -  person plamenko    schedule 10.03.2016


Ответы (1)


Я вижу несколько вещей, которые следует исправить, но ни одна из них не объясняет некорректную загрузку. Я смогу помочь, но мне понадобятся журналы logcat, как описано здесь. Кроме того, есть одна вещь, которую я не совсем понимаю. Из вашего описания кажется, что вы загружаете свои изображения вручную, сохраняете их на диск, и когда они загружаются, вы устанавливаете Uri. Почему бы не использовать Fresco для автоматической загрузки и кэширования образов на диске? Можете ли вы также предоставить этот фрагмент кода, потому что проблема вполне может быть там.

Вещи, которые следует исправить:

  1. Атрибуты adjustViewBounds и scaleType не поддерживаются SimpleDraweeView. Drawee работает с несколькими изображениями одновременно (заполнитель, изображение с ошибкой, фактическое изображение и т. д.). Каждое из них может иметь свой собственный тип масштаба, поэтому вам необходимо использовать атрибуты Drawee, как описано здесь.

  2. Если вы расширяете свое представление из XML, draweeView.getHierarchy никогда не должно быть нулевым. В любом случае у вас будет NullPointerException, потому что вы не возвращаете иерархию из этой ветки if. Таким образом, вы также можете указать изображение сбоя через XML, нет необходимости делать это программно. То же самое для продолжительности затухания, если вы всегда используете одно и то же значение.

person plamenko    schedule 10.03.2016
comment
Спасибо за ваш ответ. Если я очищаю кеш памяти (если изображение недоступно в MemoryCache) и перезагружаю его, то все работает нормально. - person Arun; 11.03.2016
comment
Карун-2189, что ты имеешь в виду? Вы говорите, что есть проблема в логике кэширования Fresco? Если да, можете ли вы уточнить, чтобы мы могли провести расследование? Опять же, я не до конца понимаю, как вы скачиваете образ, но если случается так, что вы используете одно и то же имя файла для другого изображения, то да, вам нужно сначала очистить изображение из кеша памяти, а затем перезагрузить его. В противном случае мы найдем старое изображение в кеше, и нет никакого способа узнать, действительно ли базовый файл изменился. - person plamenko; 12.03.2016
comment
пламенко, у меня не скачивается образ. Я загружаю изображение из локального хранилища. Я использую listView, каждая строка содержит simpledraweeview. Я использую один и тот же файл для разных изображений, адаптер будет повторно использовать представление, возможно, это будет проблемой. Но я использую gridview, и эта проблема не возникает для гирда. Я не знаю, почему этого не происходит для gridview. - person Arun; 14.03.2016