当前位置: 代码迷 >> Android >> 如何有效地加载gridview中的互联网图像?
  详细解决方案

如何有效地加载gridview中的互联网图像?

热度:63   发布时间:2023-08-04 11:19:39.0

我正在使用以下示例在我的活动中显示互联网图像。

在自定义图像适配器中,我直接从Internet加载图像并将其分配给imageview。

在gridview中显示图像,并且每件事情都很好,但它不是有效的方式。

当我滚动gridview它一次又一次加载图像,这就是为什么gridview滚动非常慢

是否有缓存或一些有用的技术可以使它更快?

创建一个返回位图的全局静态方法。 此方法将采用参数: contextimageUrlimageName

在方法中:

  1. 检查文件是否已存在于缓存中。 如果是,返回位图

      if(new File(context.getCacheDir(), imageName).exists()) return BitmapFactory.decodeFile(new File(context.getCacheDir(), imageName).getPath()); 
  2. 否则您必须从Web加载图像,并将其保存到缓存中:

     image = BitmapFactory.decodeStream(HttpClient.fetchInputStream(imageUrl)); 
     FileOutputStream fos = null; try { fos = new FileOutputStream(new File(context.getCacheDir(), imageName)); } //this should never happen catch(FileNotFoundException e) { if(Constants.LOGGING) Log.e(TAG, e.toString(), e); } //if the file couldn't be saved if(!image.compress(Bitmap.CompressFormat.JPEG, 100, fos)) { Log.e(TAG, "The image could not be saved: " + imageName + " - " + imageUrl); image = BitmapFactory.decodeResource(context.getResources(), R.drawable.default_cached_image); } fos.flush(); fos.close(); return image; 
    \n\n

预加载Vector<SoftReference<Bitmap>>对象与所有在使用上述方法的位图AsyncTask类,并且还另一个List持有Map imageUrls和imageNames的(供以后访问,当你需要重新加载的图像),然后设置你的GridView适配器。

我建议使用一组SoftReferences来减少使用的内存量。 如果你有大量的位图,你可能会遇到内存问题。

所以在你的getView方法中,你可能有类似的东西(其中iconsVector持有类型SoftReference<Bitmap>

myImageView.setImageBitmap(icons.get(position).get());

你需要做一个检查:

if(icons.get(position).get() == null) {
    myImageView.setImageBitmap(defaultBitmap);
    new ReloadImageTask(context).execute(position);
}

ReloadImageTask AsyncTask类,只需拨打上面创建了正确的PARAMS全局法,然后notifyDataSetChangedonPostExecute

可能需要做一些额外的工作,以确保在已经为特定项目运行时不启动此AsyncTask

您需要自己实现缓存。 创建将下载图像的代理类。 在getView中,请求此类通过传递URL来下载图像。 在代理类中创建一个HashMap,它将URL映射到Bitmap。 如果传递的URL的密钥不存在,请下载映像并存储它。 否则返回存储的位图转换为imageView。

当然,您无法存储任意数量的图像。 您需要根据预期的图像大小设置限制,例如10个图像。 超过限制时,您需要丢弃旧图像以支持新图像。

你可以尝试DroidFu。 我的应用程序使用ImageCache。 还有一些基于Web的imageview或库中的某种方式。 特别参见WebImageView和WebGalleryAdapter: ://mttkay.github.com/droid-fu/index-all.html

编辑添加:droid-fu项目已弃用,支持Ignition。