原文出自:方杰|

p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif; line-height:21px">http://fangjie.sinaapp.com/?p=193转载请注明出处

终于效果演示:

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图片异步加载、高速缓存的更多相关文章

  1. Android ListView 图片异步加载和图片内存缓存

    开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用 ...

  2. Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

    原文出自:方杰|http://fangjie.info/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54 该项目代码已经放到git ...

  3. [置顶] Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  4. Android图片异步加载框架Android-Universal-Image-Loader

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...

  5. Android 图片异步加载的体会,SoftReference已经不再适用

      在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>>  这样软引用的 ...

  6. Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  7. Android图片异步加载之Android-Universal-Image-Loader(转)

    今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全.性能最优的图片异步加载解决 ...

  8. Android图片异步加载

    原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/A ...

  9. 简单的ListView中item图片异步加载

    前言:     在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现 ...

随机推荐

  1. android EditText的美化

    今天要做一个页面,有EditText,于是就搞起了它的美化. EditText的美化,我的第一反应是,在EditText的左边设置显示一张图片,这样会比較好看. 设置左边显示图片的属性为:androi ...

  2. cocos2d-x笔记(十一)Lua发展飞机战争-5- 让飞机动

    然后在飞机上已被添加到游戏,下一步是让它动起来.主要是为了应对触摸事件. 在C++通过重写ccTouchBegan().ccTouchMoved().ccTouchEnded()三个函数来响应触摸事件 ...

  3. 朴素UNIX它-Linux CFS注视

    该系列产品,被称为纯UNIX,但它也包含各种类别UNIX该系统的细节,自从完成我多年的学习笔记本系列文章,分析了各种UNIX,类UNIX思想和情感的实现. 这篇文章是比较短.只是分析Linux CFS ...

  4. 原创游戏,金庸群侠传X 0.5公布

    首先说一下背景,我个人从小特别爱玩游戏,对小时候一款游戏<金庸群侠传>DOS版更是情有独钟,自己工作以后,利用业余时间自己整了一个原创的改编版丢网上(找图片.音乐.写剧情更是虐心之极,耗时 ...

  5. C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements

    于 C# 6.0 包裹在异常处理的新功能,有两个方面的改进: 异步处理(async and await)能力 catch block 总结使用.于 C# 5.0 释放 async and await, ...

  6. CMake入门(二)

    CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...

  7. WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

    原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7 ...

  8. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  9. POJ 1384 Piggy-Bank 背包DP

    所谓的全然背包,就是说物品没有限制数量的. 怎么起个这么intimidating(吓人)的名字? 事实上和一般01背包没多少差别,只是数量能够无穷大,那么就能够利用一个物品累加到总容量结尾就能够了. ...

  10. 【UML】概念、关联、画画(一)

    最近画UML画画,于UML观看视频后还没有学会.它是的结果UML九图是不是太懂,我想加深绘制过程的理解,我一个新的水平. 现在我觉得是时候..地介绍一下UML.了解一下它的基本内容.达到深入浅出的效果 ...