Android新浪微博client(七)——ListView图片异步加载、高速缓存
终于效果演示: page_id=54" href="http://fangjie.sinaapp.com/? page_id=54">http://fangjie.sinaapp.com/?page_id=54
该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo
一.ListView的图片异步载入
我们都知道对每个Weibo Item都实用户头像,并且每一条微博还可能带有图片。假设在载入列表的同一时候载入图片。这样有几个缺点,第一非常费事,界面卡住,用户体验非常不好,第二Android在主线程中不能有网络操作,所以本身实现起来就非常麻烦。所以我们才实现一个图片异步载入类。继承自AsyncTask<String, Void, Bitmap>,重载当中的方法。
doInBackground才是真正的异步操作。做一些耗时的任务,这里就是去server上下载图片,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 去网上载入图片
}
}
至此,微博主页的微博列表载入也就所有完毕。
还有非常多细小的点都没讲到,可是都有源代码,相信大家都能看得懂的。整个project文件截图:

代码放在:http://git.oschina.net/fangjie/Sina-Weibo 效果展示: page_id=54">http://fangjie.sinaapp.com/?page_id=54
注:因为新浪微博的开发平台申请的应用没有通过审核,所以不是全部的微博帐号都能够授权成功,须要測试的话能够找我,也能够在源代码中(com.fangjie.weibo.util.AuthUtil)改成你申请的appkey,appsecret。
微博client项目有时间再往下写吧!
欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/
版权声明:本文博主原创文章。博客,未经同意不得转载。
Android新浪微博client(七)——ListView图片异步加载、高速缓存的更多相关文章
- Android ListView 图片异步加载和图片内存缓存
开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...
- Android新浪微博客户端(七)——ListView中的图片异步加载、缓存
原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...
- [置顶] Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载框架Android-Universal-Image-Loader
版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...
- Android 图片异步加载的体会,SoftReference已经不再适用
在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>> 这样软引用的 ...
- Android图片异步加载之Android-Universal-Image-Loader
将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...
- Android图片异步加载之Android-Universal-Image-Loader(转)
今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...
- Android图片异步加载
原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...
- 简单的ListView中item图片异步加载
前言: 在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现 ...
随机推荐
- 三星Samsung 4.4.2该负责人制度,简化名单
installed uninstalled AccessControl.apk AllshareControlShare.apk AirMotionTryActually.apk AllshareFi ...
- client对象层次和0级DOM
刚開始学了两天JS,闲着无聊,顺手画了张图
- crm2011js子网格导航栏字段事件操作
- Phoenix Framework对于Tree该方法节点设置不同的图标,每个
在包Javax Swing的Tree对象.我们需要设置不同的图标为每个节点.它封装了一个通用的方法: 用法: jTree1.setCellRenderer(new TreeNodeRender(cas ...
- [Windows Phone] 地图控制项的经纬度
原文:[Windows Phone] 地图控制项的经纬度 前言 本文主要示范如何使用地图经纬度以及显示地标和行人街道,并透过卷轴控制地图缩放比例的功能. ? 实作 step1 建立专案. ? step ...
- JAVA网络编程Socket常见问题 【长连接专题】
一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ...
- 【LeetCode】【Python解决问题的方法】Best Time to Buy and Sell Stock II
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- jQuery插件使用和写法
jQuery插件分类3中: 1.封装对象方法的插件. 2.封装全局函数的插件. 3.选择器插件. jQuery插件机制 jQuery提供了两个用于扩展jQuery功能的方法: 1.jQuery.fn. ...
- Java Web整合开发(79) -- Struts 2
一. Struts 2.x 概述 不继承任何类的Action Struts 2的Action并不一定要实现Action接口或者继承ActionSupport,任何POJO都可以做Action,只要这个 ...
- SPOJ TWOPATHS Two Paths
题目意思:给一棵树,找到俩个不相交的通路,使得这俩个通路的长度和乘机最大: 解法: 小哥一看呵呵 这不就是枚举点 然后求俩边的树的直径在相乘求个最大值的题么! 呵呵 这个N 有100000 当时就不玩 ...