Android新浪微博client(七)——ListView图片异步加载、高速缓存
原文出自:方杰|http://fangjie.sinaapp.com/?p=193?轉載請注明出處
終于效果演示:http://fangjie.sinaapp.com/?page_id=54
該項目代碼已經(jīng)放到github:https://github.com/JayFang1993/SinaWeibo
一.ListView的圖片異步載入
我們都知道對每個Weibo Item都實用戶頭像,并且每一條微博還可能帶有圖片。假設在載入列表的同一時候載入圖片。這樣有幾個缺點,第一非常費事,界面卡住,用戶體驗非常不好,第二Android在主線程中不能有網(wǎng)絡操作,所以本身實現(xiàn)起來就非常麻煩。所以我們才實現(xiàn)一個圖片異步載入類。繼承自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常常會上下滑動,而這些圖片載入任務就會重復調用。這樣就非常浪費。能夠為圖片實現(xiàn)緩存,當某個圖片載入過之后須要再次顯示僅僅須要從內(nèi)存中拿出來顯示就能夠。不須要再去載入。緩存事實上有兩種緩存。一種是內(nèi)存緩存。還有一種是SD卡緩存,即下載圖片到SD卡中。這里我們僅僅講內(nèi)存緩存。
結合上面的圖片異步載入,整個圖片顯示的過程是這樣:當須要顯示圖片的時候,先去內(nèi)存中查找看是否有這樣的圖片的緩存。有的話就直接顯示,沒有的話,去異步載入,然后保存到內(nèi)存緩存中。然后顯示。
完整的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 方法將圖片增加內(nèi)存緩存中。要給這個圖片一個key 方便下次從緩存中取出來 private void addBitmapToMemoryCache(String key, Bitmap bitmap) { if (getBitmapFromMemoryCache(key) == null) { lruCache.put(key, bitmap); } } //調用Lrucache的get 方法從內(nèi)存緩存中去圖片 public Bitmap getBitmapFromMemoryCache(String key) { return lruCache.get(key); } }在WeiboAdapter中的調用接口,loadBitmap
private final int maxMemory = (int) Runtime.getRuntime().maxMemory();//獲取當前應用程序所分配的最大內(nèi)存 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);//首先從內(nèi)存緩存中獲取圖片if (bitmap != null) {image.setImageBitmap(bitmap);//假設緩存中存在這張圖片則直接設置給ImageView} else {image.setImageResource(R.drawable.user_head);//否則先設置成默認的圖片asyncLoader.execute(urlStr);//然后運行異步任務AsycnTask 去網(wǎng)上載入圖片}}
至此,微博主頁的微博列表載入也就所有完畢。
還有非常多細小的點都沒講到,可是都有源代碼,相信大家都能看得懂的。整個project文件截圖:
代碼放在:http://git.oschina.net/fangjie/Sina-Weibo? 效果展示:http://fangjie.sinaapp.com/?page_id=54
注:因為新浪微博的開發(fā)平臺申請的應用沒有通過審核,所以不是全部的微博帳號都能夠授權成功,須要測試的話能夠找我,也能夠在源代碼中(com.fangjie.weibo.util.AuthUtil)改成你申請的appkey,appsecret。
微博client項目有時間再往下寫吧!
?歡迎各位關注我的個人網(wǎng)站:http://fangjie.sinaapp.com/?
版權聲明:本文博主原創(chuàng)文章。博客,未經(jīng)同意不得轉載。
總結
以上是生活随笔為你收集整理的Android新浪微博client(七)——ListView图片异步加载、高速缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树深度和平衡二叉树的判定
- 下一篇: CentOS6.5下Nginx1.7.4