原文出自:方杰|http://fangjie.sinaapp.com/?p=193 转载请注明出处

终于效果演示: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  效果展示:http://fangjie.sinaapp.com/?page_id=54

:因为新浪微博的开发平台申请的应用没有通过审核,所以不是全部的微博帐号都能够授权成功,须要測试的话能够找我,也能够在源代码中(com.fangjie.weibo.util.AuthUtil)改成你申请的appkey,appsecret。

微博client项目有时间再往下写吧!

欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android新浪微博client(七)——ListView图片异步加载、高速缓存相关推荐

  1. ListView中的图片异步加载、缓存

    一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不好 ...

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

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

  3. android复位机器人图片_Universal-Image-Loader 图片异步加载类库还不熟?

    码个蛋(codeegg) 第 824 次推文 作者:欢醉 博客:https://cloud.tencent.com/developer/article/1026386 码妞看世界 写在前面 这个图片异 ...

  4. android webview 图片异步加载,Webview 图片异步加载及bug解决

    在项目中新闻显示需要使用图片的异步加载,并且在加载图片前和加载图片失败时显示默认图片. 关于webview中图片的异步加载的思路如下: 方案一:由前端同学全权负责(使用js实现异步加载) 方案二:an ...

  5. Android 图片异步加载

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  6. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    UIL( Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)) http://blog.csdn.net/vipzjyno1/article/detai ...

  7. ImageLoader 图片异步加载类库的使用

    http://blog.csdn.net/vipzjyno1/article/details/23206387 这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用, ...

  8. 基于jQuery的图片异步加载和预加载实例

    如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...

  9. Android中的缓存处理及异步加载图片类的封装

    一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端--服务器端应用,从远程获取图 ...

最新文章

  1. [asp.net core]project.json(1)
  2. 协程的概念及Python中利用第三方库gevent使用协程
  3. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释
  4. IOS 高级语法与设计模式5(5.3 协议的基本概念及用法)
  5. HDLBits答案(18)_Verilog有限状态机(5)
  6. 小波相干wtc matlab,实现时间序列的小波相干性分析,并画出图谱
  7. Java 操作POI 之复制sheet页
  8. outofmemory异常如何解决?
  9. 在哪个国家生活幸福?24秒看完联合国10年报告
  10. dns服务期搭建使用_使用maradns搭建简易dns服务器(本地实现dns劫持)
  11. 给你一碗孟婆汤,你会忘记什么?
  12. 目标检测——Detectron2的学习笔记
  13. 模拟grid点击事件
  14. python所有软件-一款Python黑客打造的勒索软件,让所有国产杀毒软件升起无力感!...
  15. 第一章:x264视频制作meGUI工具下载
  16. Linux 系统设置静态ip地址
  17. 用PS将照片背景变成白色
  18. CAD画虚线怎么调比例?CAD画虚线教程
  19. 你未必知道的 WebRTC:前世、今生、未来
  20. 关于SAPI的两段小代码(c++)

热门文章

  1. 剑指Offer Ⅱ 003.二进制加法(力扣剑指Offer专项突击版——整数_3)
  2. python 装饰器 生成器 迭代器和闭包
  3. android内存优化方法,Android开发内存优化注意事项和方法
  4. php随机数字不重复,php生成N个不重复的随机数
  5. jpa oracle mysql,oracle+jpa和mysql+mybatis的混合多数据源配置例子
  6. java 中文怎么截取,java String 中文 字符串 截取
  7. JavaScript数组的API
  8. 【新星计划】MATLAB-字符串处理
  9. 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
  10. E数据结构实验之查找五:平方之哈希表