2013-03-09 47 views
0

我有一个自定义AdapterView(有点),其中我懒加载图像。要做到这一点,我使用了令人敬畏的aquery libraryAquery - 高速缓存下采样版本的图像

短篇小说:我想缓存(memcache和filecache)下采样版本的文件。它使添加到我的适配器的速度更快 - 当图像很小时,在滚动我的AdapterView时没有滞后。当图像很大时,即使我使用下采样,它也会滞后一点。我发现,aquery存储完整版本的图像,并在每次拨打电子邮件aq.image(...)时进行缩减采样。 如何缓存调整后的版本,而不是原来的?


长的故事: 我的适配器视图在很大程度上依赖于图像。这些图像相当大,当适配器项目被实例化时,需要一些时间对其进行缩减采样,然后添加到列表中。所以我认为这很好,在滚动时用低分辨率照片实例化项目,并且只在滚动停止时加载高分辨率版本。当我使用两个独立的图像URL(一个用于thumnbail,另一个用于原始图像)时,它的作用就像一个魅力。但我使用的API非常有限,所以我不会有缩略图图像的网址。我必须异步下载大版本,缩小版本,保存大小版本,然后使用我需要的版本。这里的“短篇故事”开始了。

+0

您是否最终设法使其与水果或你切换到一些替代品? – JanBo 2015-03-09 18:07:32

+0

我现在使用毕加索 – 2015-03-09 18:08:55

+0

我原来从毕加索切换到aquery因为毕加索会失败,如果我试图下载并显示额外的大图像(更大的2048px ...没有做适当的下采样)...但我可以再次让它去吧如果你没有这些问题... – JanBo 2015-03-09 18:11:16

回答

1

我也用AQuery库在过去,但遇到一些问题,有限的配置和怪异progresbar知名度的问题后,我搬到了Android系统的通用-图像装载机

https://github.com/nostra13/Android-Universal-Image-Loader它给你你需要的功能,以及其他很多有用的配置选项。

只需从上到下阅读本网站 - 您应该可以在一分钟内运行它。

在你的情况最有趣的线

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 
    .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75) 
    .discCache(new UnlimitedDiscCache(cacheDir)) // default 
    .discCacheSize(50 * 1024 * 1024) 
    .discCacheFileCount(100) 

您还可以更改缓存的文件名。

+0

谢谢,我会看看。我喜欢AQuery的简单性,我希望可以用这个库来做,但我读了两个小时的源代码,找不到任何东西......也许AUIL会更适合我 – 2013-03-09 21:41:15

+0

不幸的是:'memoryCacheExtraOptions(50, 50)'只能在'init'阶段设置。我无法以每个文件为基础设置缩略图大小。另外,它似乎并没有使用我的设置。我将它设置为(50,50),但位图仍然是高分辨率。 – 2013-03-09 23:28:19

2

我刚刚发布了一个名为droidQuery的开源库,它是Android的完整端口jQuery。使用比AQuery简单得多,并提供了更多的配置。要下载图像并设置输出大小并缓存小图像(以每会话/每十分钟为基础),可以使用以下代码:

final ImageView image = (ImageView) findViewById(R.id.myImage); 
$.ajax(new AjaxOptions(url).type("GET") 
          .dataType("image") 
          .imageHeight(200) 
          .imageWidth(200) 
          .context(this) 
          .cache(true) 
          .cacheTimeout(600000) 
          .success(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            $.with(image).val((Bitmap) params[0]); 
           } 
          }) 
          .error(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            droidQuery.toast("could not set image", Toast.LENGTH_SHORT); 
           } 
          }));