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

android – 如何有效地加载gridview中的互联网图像?,第1张

概述我正在使用以下示例在我的活动中显示互联网图像. http://developer.android.com/resources/tutorials/views/hello-gridview.html 在自定义图像适配器中,我直接从Internet加载图像并将其分配给imageview. 在gridview中显示图像,并且每件事情都很好,但它不是有效的方式. 当我滚动gridview它一次又一次加载图 我正在使用以下示例在我的活动中显示互联网图像.

http://developer.android.com/resources/tutorials/views/hello-gridview.html

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

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

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

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

解决方法 创建一个返回Bitmap的全局静态方法.此方法将采用参数:context,imageUrl和imagename.

在方法中:

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

if(new file(context.getCacheDir(),imagename).exists())        return BitmapFactory.decodefile(new file(context.getCacheDir(),imagename).getPath());

>否则您必须从Web加载图像,并将其保存到缓存中:

image = BitmapFactory.decodeStream(httpClIEnt.fetchinputStream(imageUrl));
fileOutputStream fos = null;try {    fos = new fileOutputStream(new file(context.getCacheDir(),imagename));}//this should never happencatch(fileNotFoundException e) {    if(Constants.LOGGING)        Log.e(TAG,e.toString(),e);}//if the file Couldn't be savedif(!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;

预加载Vector< SoftReference< Bitmap>>使用上述方法在AsyncTask类中使用所有位图的对象,以及另一个包含imageUrls和imagenames的Map的List(以便在需要重新加载图像时进行访问),然后设置GrIDVIEw适配器.

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

所以在你的getVIEw方法中,你可能有类似的东西(其中图标是Vector持有类型SoftReference< Bitmap>:

myImageVIEw.setimageBitmap(icons.get(position).get());

你需要做一个检查:

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

在ReloadImageTask AsyncTask类中,只需使用正确的参数调用从上面创建的全局方法,然后在onPostExecute中调用notifyDataSetChanged

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

fileOutputStream fos = null;try { fos = new fileOutputStream(new file(context.getCacheDir(),R.drawable.default_cached_image);}fos.flush();fos.close();return image;myImageVIEw.setimageBitmap(icons.get(position).get());if(icons.get(position).get() == null) { myImageVIEw.setimageBitmap(defaultBitmap); new ReloadImageTask(context).execute(position);}
总结

以上是内存溢出为你收集整理的android – 如何有效地加载gridview中的互联网图像?全部内容,希望文章能够帮你解决android – 如何有效地加载gridview中的互联网图像?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1137527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存