ListView中的图片异步加载、缓存
一.ListView的图片异步加载
我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片。如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不好,第二Android在主线程中不能有网络操作,所以本身实现起来就很麻烦。所以我们才实现一个图片异步加载类。继承自AsyncTask<String, Void, Bitmap>,重载其中的方法。doInBackground才是真正的异步操作,做一些耗时的任务,这里就是去服务器上下载图片,onPostExecute是在doInBackground结束后调用的,并传入doInBackground的返回值。
public AsyncImageLoader(ImageView image, LruCache<String, Bitmap> lruCache,int width,int height) { super(); this.image = image; this.lruCache = lruCache; this.width=width;this.height=width;} @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; bitmap = GetUserInfo.getBitmap(params[0]); if(width!=0&height!=0)bitmap=GetUserInfo.scaleImg(bitmap, width, height);addBitmapToMemoryCache(params[0], bitmap); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { image.setImageBitmap(bitmap); }
然后在WeiboAdapter中封装一个接口 loadBitmap,加载图片。
二.ListView图片缓存
ListView经常会上下滑动,而这些图片加载任务就会反复调用,这样就很浪费。可以为图片实现缓存,当某个图片加载过之后需要再次显示只需要从内存中拿出来显示就可以,不需要再去加载。缓存其实有两种缓存,一种是内存缓存,另一种是SD卡缓存,即下载图片到SD卡中。这里我们只讲内存缓存。
结合上面的图片异步加载,整个图片显示的过程是这样:当需要显示图片的时候,先去内存中查找看是否有这种图片的缓存,有的话就直接显示,没有的话,去异步加载,然后保存到内存缓存中,然后显示。
完整的AsyncImageLoader.java代码
package com.fangjie.weibo.util; import android.graphics.Bitmap; import android.os.AsyncTask; import android.support.v4.util.LruCache; import android.widget.ImageView;public class AsyncImageLoader extends AsyncTask<String, Void, Bitmap> {private ImageView image; private LruCache<String, Bitmap> lruCache; private int width;private int height;/** * 构造方法,需要把ImageView控件和LruCache 对象传进来 * @param image 加载图片到此 {@code}ImageView * @param lruCache 缓存图片的对象 */ public AsyncImageLoader(ImageView image, LruCache<String, Bitmap> lruCache,int width,int height) { super(); this.image = image; this.lruCache = lruCache; this.width=width;this.height=width;} @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; bitmap = GetUserInfo.getBitmap(params[0]); if(width!=0&height!=0)bitmap=GetUserInfo.scaleImg(bitmap, width, height);addBitmapToMemoryCache(params[0], bitmap); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { image.setImageBitmap(bitmap); } //调用LruCache的put 方法将图片加入内存缓存中,要给这个图片一个key 方便下次从缓存中取出来 private void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (getBitmapFromMemoryCache(key) == null) { lruCache.put(key, bitmap); } } //调用Lrucache的get 方法从内存缓存中去图片 public Bitmap getBitmapFromMemoryCache(String key) { return lruCache.get(key); } }
在WeiboAdapter中的调用接口,loadBitmap
private final int maxMemory = (int) Runtime.getRuntime().maxMemory();//获取当前应用程序所分配的最大内存 private final int cacheSize = maxMemory / 5;//只分5分之一用来做图片缓存 private LruCache<String, Bitmap> mLruCache = new LruCache<String, Bitmap>( cacheSize) { protected int sizeOf(String key, Bitmap bitmap) {//复写sizeof()方法 // replaced by getByteCount() in API 12 return bitmap.getRowBytes() * bitmap.getHeight() / 1024; //这里是按多少KB来算 } }; /*** * @param urlStr 所需要加载的图片的url,以String形式传进来,可以把这个url作为缓存图片的key* @param image ImageView 控件*/private void loadBitmap(String urlStr, ImageView image,int width,int height) {System.out.println(urlStr);AsyncImageLoader asyncLoader = new AsyncImageLoader(image, mLruCache,width,height);//什么一个异步图片加载对象Bitmap bitmap = asyncLoader.getBitmapFromMemoryCache(urlStr);//首先从内存缓存中获取图片if (bitmap != null) {image.setImageBitmap(bitmap);//如果缓存中存在这张图片则直接设置给ImageView} else {image.setImageResource(R.drawable.user_head);//否则先设置成默认的图片asyncLoader.execute(urlStr);//然后执行异步任务AsycnTask 去网上加载图片 }}
至此,微博主页的微博列表加载也就全部完成。还有很多细小的点都没讲到,但是都有源码,相信大家都能看得懂的。整个工程文件截图:
代码放在:http://git.oschina.net/fangjie/Sina-Weibo 效果展示:http://fangjie.sinaapp.com/?page_id=54
注:由于新浪微博的开发平台申请的应用没有通过审核,所以不是所有的微博帐号都可以授权成功,需要测试的话可以找我,也可以在源码中(com.fangjie.weibo.util.AuthUtil)改成你申请的appkey,appsecret。
微博客户端项目有时间再往下写吧!
ListView中的图片异步加载、缓存相关推荐
- android webview 图片异步加载,Webview 图片异步加载及bug解决
在项目中新闻显示需要使用图片的异步加载,并且在加载图片前和加载图片失败时显示默认图片. 关于webview中图片的异步加载的思路如下: 方案一:由前端同学全权负责(使用js实现异步加载) 方案二:an ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的方式 ...
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...
- android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?
码个蛋(codeegg) 第 824 次推文 作者:欢醉 博客:https://cloud.tencent.com/developer/article/1026386 码妞看世界 写在前面 这个图片异 ...
- ImageLoader 图片异步加载类库的使用
http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用, ...
- 基于jQuery的图片异步加载和预加载实例
如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...
- Android 图片异步加载
所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...
- ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
此次的demo是一个页面,页面上有两行字,然后后面用ajax,使用一个下拉框去替换第一行文字[/code] 第一个是被替换的网页 var xmlhttprequest; function create ...
- 关于Vue admin 框架中 Pagination 分页 异步加载的问题
关于Vue admin 框架中 Pagination 分页 异步加载的问题 贴代码 核心代码: this.$emit('update:page', this.currentPage) this.$em ...
最新文章
- ubuntu下编译安装PHP
- ehcache config xml file
- string转map集合_Map、斗地主案例
- LeetCode 1668. 最大重复子字符串
- 理论基础 —— 二叉树 —— 线索链表
- 设计模式学习笔记——适配器(Adapter)模式
- 软件测试工程师-缺陷报告
- 现在开始做一些什么事情可以在五年以后大为收益? Answer by FindProz.com Co-founder
- 汉文博士 0.5.7.2356 版发布
- Python安装Tensorflow
- 可替代Visio的免费流程图软件draw.io(含下载地址)
- Codeforces 1253B Silly Mistake
- docker离线包制作
- 形容java工作者的句子_一些形容工作态度的句子
- c语言vt指令,VT系列一:VT简述
- 服务器审计资质证书,利用ACS服务器实现用户的认证、授权和审计
- ZZULIOJ:1148: 组合三位数之一
- java pdf 插入图片_java在pdf模板的指定位置插入图片
- 2017年全国高中数学联赛及2017年贵州省预赛试题
- Unity中空气墙的制作
热门文章
- 【计算机网络】数据链路层 : 局域网基本概念 ( 局域网分类 | 拓扑结构 | 局域网特点 | 局域网传输介质 | 介质访问控制方法 | IEEE 802 | 链路层 LLC、MAC 控制子层 )
- 【Android 应用开发】Android - TabHost 选项卡功能用法详解
- hdu 2021 发工资咯:)(c语言)
- “全能”选手—Django 1.10文档中文版Part1
- 如何下载和离线安装Chrome的CRX扩展文件包
- RMQ+1/-1算法
- 轉:showModalDialog和showModelessDialog使用心得
- VS切换到按F5不需要按Fn键的快捷键模式
- 深入理解 __doPostBack
- 分析vue-cli@2.9.3 搭建的webpack项目工程