編輯:關於Android編程
Volley框架的學習馬上就可以“殺青”了,哈哈,有木有點小激動呢,之所以將這個框架分成三篇來寫,而且涉及的細節比較多,是因為考慮到後面還要學習幾個Android http框架,只要認認真真看完volley框架的學習,後面幾個框架的學習簡直“易如反掌”。
這篇主要介紹圖片請求以及緩存的問題,這在開發中似乎是最常用到的,所以最後咱們一起來做個Demo來練習一下!
文章結構如下:
為了更方便的使用Volley中的圖片請求,我們同樣先在ApplicationController
類中封裝一個ImageLoader
public class ApplicationController extends Application{
/*前面寫過的方法不再贅述*/
private ImageLoader imageLoader;
....
public ImageLoader getImageLoader(){
getRequestQueue();
//如果imageLoader為空則創建它,第二個參數代表處理圖像緩存的類
if(imageLoader==null){
imageLoader=new ImagerLoader(this.reqQueue,new LruBitmapCache());
}
return this.imageLoader;
}
}
public class LruBitmapCache extends LruCache implements ImageCache{
public static int getDefaultLruCacheSize(){
final int maxMemory=(int)(Runtime.getRuntime().maxMemory/1024);
final int cacheSize=maxMemory/8;
return cacheSize;
}
public LruBitmapCache(){
this(getDefaultLruBitmapCacheSize);
}
public LruBitmapCache(int sizeInKiloBytes){
super(sizeInkiloBytes);
}
@Override
public int sizeOf(String key,Bitmap Value){
return value.getRowBytes()*value.getHeight()/1024;
}
@Override
public Bitmap getBitmap(String url){
return get(url);
}
@Override
public void putBitmap(String url,Bitmap bitmap){
put(url,bitmap);
}
}
完成上述步驟後,在使用的時候我們首先需要獲取ImageLoader對象
ImageLoader imageLoader=ApplicationController.getInstance().getImageLoader();
將圖片載入ImageView
可以使用Volley自己提供的一個Image視圖,NetworkImageView
,幾行代碼就可以搞定
//將NetworkImageView布局在布局文件中
NetworkImageView imageView=(NetworkImageView)findViewById(R.id.networkimageview);
//需要用到imageLoader
imageView.setImageUrl(url,imageLoader);
如果要將圖片直接載入ImageView,可以通過以下方法:
ImageLoader imageLoader=ApplicationController.getInstance().getImageLoader();
imageLoader.get(url,new ImageListener(){
@Override
public void onResponse(ImageContainer response,boolean arg) {
if(response.getBitmap()!=null){
//設置imageView
imageView.setImageBitmap(response.getBitmap());
}
}
@Override
public void onErrorResponse(VolleyError error){
Log.e(TAG,Image Error+error.getMessage());
}
});
從緩存中讀取請求:即先從緩存讀取看是否有緩存數據,如果沒有則請求網絡數據Volley有著強大的緩存機制用來維護請求到的緩存,這節省了不必要的網絡消耗和等待時間,下面是一些關於緩存的常用方法
Cache cache=ApplicationController.getRequestQueue().getCache();
Entry entry=cache.get(url);
if(entry!=null){
try{
String data=new String(entry.data,Utf-8);
//處理data,將其轉化為JSON,XML,Bitmap等等
}catch(UnspportedEncodingException e){
e.printStackTrace();
}
}else{
//緩存中不存在,做網絡請求
}
緩存失效:緩存失效並不意味這刪除緩存,volley仍將使用緩存對象,直到服務器返回新數據,一旦接收到新數據,將覆蓋原來的緩存
ApplicationController.getInstance().getRequestQueue().getCache().invalidate(url,true);
關閉緩存:如果你想禁用特定Url的緩存可以使用以下方法
StringRequest req=new StringRequest(...);
req.setShouldCache(false);
刪除來自特定url的緩存
ApplicationController.getInstance().getRequestQueue().getCache().remove(url);
刪除所有緩存
ApplicationController.getInstance().getRequestQueue().getCache().clear(url);
綜上,已經學完了Volley框架的使用,在實際應用中遇到具體的問題需要具體考慮,必要時要學會查閱資料,除了以上幾篇提到的參考資料,最好能翻牆去看看google官方關於Volley的文檔,我想基本上能解決我們所碰到的問題。
Android UI組件進階(1)——帶進度條的按鈕 本節引言: 這個系列是繼Android UI組件實例大全後的進階
摘要:Android L平台在圖形渲染方面有一項重要的改進,它引入了一個專門的線程用於執行渲染工作,UI線程負責生成的顯示列表(DisplayList),渲染線程負責重放
前言在操作系統中,線程是操作系統調度的最小單元,同事線程又是一種受限的系統資源,即線程不能無限制地產生,並且線程的創建和銷毀都有一定的開銷.當系統中存在大量的線程時,系統
此方法適用於所有母控件無法獲取焦點的情況 開發中很常見的一個問題,項目中的listview不僅僅是簡單的文字,常常需要自己定義listview,自己的Adapter去繼承