Android 通用图像加载程序:忽略ImageScaleType

Android 通用图像加载程序:忽略ImageScaleType,android,bitmap,universal-image-loader,Android,Bitmap,Universal Image Loader,我正在使用UIL加载位图。它很好用。但是当我将它与小部件一起使用时,我遇到了一个问题 我正在加载自定义非可视软件: private static class WidgetImageAware extends NonViewAware { protected final int mId; public WidgetImageAware(int imageSize, int id) { super(new ImageSize(imageSize, image

我正在使用UIL加载位图。它很好用。但是当我将它与小部件一起使用时,我遇到了一个问题

我正在加载自定义
非可视软件

private static class WidgetImageAware extends NonViewAware
{
    protected final int mId;

    public WidgetImageAware(int imageSize, int id)
    {
        super(new ImageSize(imageSize, imageSize), ViewScaleType.CROP);
        mId = id;
    }

    @Override
    public int getId()
    {
        return mId;
    }
}
要设置缩放比例,我使用
displaymageoptions
中的
imageScaleType(imageScaleType.justice)

致电后:

imageLoader.displayImage(someUri, new WidgetImageAware(480, id), displayImageOptions, new SimpleImageLoadingListener()
    {
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
        {
            height = loadedImage.getHeight() // height == 950 !!
            width = loadedImage.getWidth() // width == 950 !!
        }
    });
因此,加载的位图的大小(950x950)比Aware中请求的(480x480)大得多。我需要加载大小正好为480x480的位图。否则,小部件的更新将引发:

java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 3632836, max: 2304000) The total memory cannot exceed that required to fill the device's screen once.

因此,将DisplayImageOptions的两个实例与两个不同的ImageScaleType一起使用时会出现错误

它根据首次使用的ImageScaleType进行缓存,并忽略所有正在进行的ImageScaleType。这是由缓存中忽略ImageScaleType的密钥生成过程引起的

我已将问题简化为以下测试示例:

public void testMultipleImageScaleTypes() throws InterruptedException
{
    final CountDownLatch lock = new CountDownLatch(1);
    final List<Bitmap> bitmaps = new ArrayList<>();

    // this image is 950x950
    final String uri = "http://spaceplace.nasa.gov/review/3d-gallery/sun-sdo-disk.en.jpg";
    final DisplayImageOptions first = new DisplayImageOptions.Builder().imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2).cacheInMemory(true).build();
    final DisplayImageOptions second = new DisplayImageOptions.Builder().imageScaleType(ImageScaleType.EXACTLY).cacheInMemory(true).build();

    ImageLoader.getInstance().init(new ImageLoaderConfiguration.Builder(getContext()).memoryCache(new LRULimitedMemoryCache(2048)).build());

    ImageLoader.getInstance().displayImage(uri, new NonViewAware(new ImageSize(480,480), ViewScaleType.CROP), first, new SimpleImageLoadingListener()
    {
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
        {
            bitmaps.add(loadedImage);

            ImageLoader.getInstance().displayImage(uri, new NonViewAware(new ImageSize(480,480), ViewScaleType.CROP), second, new SimpleImageLoadingListener()
            {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
                {
                    bitmaps.add(loadedImage);

                    lock.countDown();
                }
            });
        }
    });

    lock.await(1, TimeUnit.HOURS);

    assertEquals(950, bitmaps.get(0).getWidth());
    assertEquals(950, bitmaps.get(0).getHeight());
    assertEquals(480, bitmaps.get(1).getWidth()); // it fails here - bitmap size is 950x950
    assertEquals(480, bitmaps.get(1).getHeight());
}
public void testmultipleImageScaleType()引发InterruptedException
{
最终倒计时闩锁=新倒计时闩锁(1);
最终列表位图=新的ArrayList();
//此图像是950x950
最终字符串uri=”http://spaceplace.nasa.gov/review/3d-gallery/sun-sdo-disk.en.jpg";
final DisplayImageOptions first=new DisplayImageOptions.Builder().imageScaleType(imageScaleType.IN_SAMPLE_POWER_OF_2.cacheInMemory(true).build();
final DisplayImageOptions second=new DisplayImageOptions.Builder().imageScaleType(imageScaleType.justice).cacheInMemory(true.build();
ImageLoader.getInstance().init(新的ImageLoaderConfiguration.Builder(getContext()).memoryCache(新的LRULimitedMemoryCache(2048)).build());
ImageLoader.getInstance().displayImage(uri,新的非可视软件(新的ImageSize(480480),ViewScaleType.CROP),首先是新的SimpleImageLoadingListener()
{
@凌驾
public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像)
{
位图。添加(LoadeImage);
ImageLoader.getInstance().displayImage(uri,新的非可视软件(新的ImageSize(480480),ViewScaleType.CROP),第二个,新的SimpleImageLoadingListener()
{
@凌驾
public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像)
{
位图。添加(LoadeImage);
锁。倒计时();
}
});
}
});
锁定。等待(1,时间单位。小时);
assertEquals(950,位图.get(0.getWidth());
assertEquals(950,位图.get(0.getHeight());
assertEquals(480,bitmaps.get(1.getWidth());//此处失败-位图大小为950x950
assertEquals(480,位图.get(1.getHeight());
}

我已经提交了错误报告。解决方法可能是为不同的ImageScaleType使用不同的ImageLoader实例。但这相当浪费内存。

也许这个答案可以帮助您-不幸的是,没有。所有大小都是按要求设置的:getWidth和getHeight返回480,ImageScaleType设置为正好。