Размер изображений в кеше памяти больше реального размера при использовании Universal Image Loader

В моем приложении есть ListView с изображениями. Он загружает изображения из Интернета с помощью универсального загрузчика изображений (1.7.0).

Параметры конфигурации и отображения:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                .cacheInMemory()
                .cacheOnDisc()
                .build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
                .defaultDisplayImageOptions(defaultOptions)
                .threadPoolSize(2)
                .enableLogging()
                .build();

Часть getView() (мое приложение повторно использует ConvertView и шаблон ViewHolder):

View rowView = convertView;

ViewHolder holder;

if (rowView == null) {
    LayoutInflater inflater = activity.getLayoutInflater();
    rowView = inflater.inflate(R.layout.list_row, null, true);
    holder = new ViewHolder();
    holder.photoView = (ImageView) rowView.findViewById(R.id.list_photo_view);

    rowView.setTag(holder);
} else {
    holder = (ViewHolder) rowView.getTag();
}
String photoUrl = "http://someserver.com/some_image.jpg";
mImageLoader.displayImage(photoUrl, holder.photoView);

list_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:clickable="true" >

    <ImageView
        android:id="@+id/list_photo_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="false"
        android:contentDescription="@string/photo"
        android:scaleType="centerInside"
        android:src="@drawable/template_image_list" />

</LinearLayout>

Конечно, ImageView не является одним представлением в каждой строке. Это короткая версия :). Таким образом, размеры изображений, которые я загружаю из Интернета, составляют 450x337. Я тестирую свое приложение на планшете с размером экрана 1280x760.

Как включил логирование - вижу такие сообщения:

Load image from memory cache [http://someserver.com/some_image.jpg_1280x736]

И так далее... Меня немного смущает окончание URL - "_1280x736". Как сказано во второй части руководства:

• maxImageWidthForMemoryCache() и maxImageHeightForMemoryCache() используются для декодирования изображений в объекты Bitmap. Чтобы не хранить в памяти полноразмерное изображение, его уменьшают до размера, определяемого из значений параметров ImageView, куда загружается изображение: maxWidth и maxHeight (первый этап), layout_width и layout_height (второй этап). Если эти параметры не определены (значения fill_parent и wrap_content считаются неопределенными), то берутся размеры, заданные настройками maxImageWidthForMemoryCache() и maxImageHeightForMemoryCache(). Размер исходного изображения уменьшается в 2 раза (рекомендуется для быстрого декодирования), пока ширина или высота не станут меньше заданных значений; o Значения по умолчанию - размер экрана устройства.

Итак, как я понимаю, это окончание - это размер изображения в кеше памяти после «уменьшения» :), и загрузчик изображений использовал значение по умолчанию (размер экрана). Я не удивлен, что загрузчик изображений не смог получить размер ImageView (возможно, слишком рано), но почему исходное изображение было увеличено? Сложно проверить размеры исходного изображения и оставить их без изменений? Конечно, я могу добавить размеры изображений в метод displayImage, но мне нужно объяснение...


person Paul Annekov    schedule 17.12.2012    source источник


Ответы (1)


Хороший подробный вопрос.

Окончание URL, например "_1280x736", не означает размер результирующего растрового изображения. Это целевой размер исходного изображения, до которого нужно уменьшить масштаб. В вашем случае он равен размеру экрана устройства, а исходное изображение (которое меньше этого целевого размера) не будет масштабироваться (пока вы не установите ImageScaleType.EXACTLY_STRETCHED в параметрах отображения).

Так что не волнуйтесь. Если вы видите реальный размер растрового изображения в среде выполнения, вы увидите исходный размер изображения (не 1280x736).

person nostra13    schedule 17.12.2012