使用Universal Image Loader,内存缓存中的图像大小高于实际大小

时间:2012-12-17 15:16:38

标签: java android universal-image-loader

我的应用有ListView图像。它使用Universal Image Loader(1.7.0)从Internet加载图像。

配置和显示选项

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]

依此类推......我对网址结尾有点困惑 - “_1280x736”。正如second part of manual所说:

  

•maxImageWidthForMemoryCache()和maxImageHeightForMemoryCache()用于将图像解码为Bitmap对象。为了不在存储器中存储全尺寸图像,将其缩小到由加载图像的ImageView参数的值确定的大小:maxWidth和maxHeight(第一阶段),layout_width和layout_height(第二阶段)。如果未定义这些参数(值fill_parent和wrap_content被视为不确定),则采用设置maxImageWidthForMemoryCache()和maxImageHeightForMemoryCache()指定的维度。原始图像的大小减少2倍(推荐用于快速解码),直到宽度或高度变得小于指定值;   o默认值 - 设备屏幕的大小。

所以,据我所知,这个结尾是“reduce”:)之后内存缓存中图像的大小,而图像加载器使用了默认值(屏幕大小)。我并不感到惊讶的是图像加载器无法获得ImageView的大小(可能太早),但为什么原始图像被放大了?是否很难验证原始图像的大小并保留它们而不进行修改?当然,我可以为displayImage方法添加图像大小,但我需要解释...

1 个答案:

答案 0 :(得分:2)

很详细的问题。

网址结尾,如“_ 1280x736”,并不代表结果位图的大小。缩小原始图像的目标尺寸。在您的情况下,它等于设备屏幕大小和原始图像(此目标大小较小)将不会缩放(直到您在显示选项中设置ImageScaleType.EXACTLY_STRETCHED。)

所以不要担心。如果您在运行时看到真实的位图大小,那么您将看到原始图像大小(不是1280x736)。