[置頂] ym―― Android網絡框架Volley(終極篇)
來源:程序員人生 發布時間:2014-11-11 09:03:11 閱讀次數:2422次
沒看使用過Volley的同學可以,先看看 Android網絡框架Volley(體驗篇)和Android網絡框架Volley(實戰篇)在進行本篇學習這樣會更好的理解本篇內容.
本篇內容主要是講Volley在某些細節方面的選擇和實現.值得我們學習的地方和如果更好的使用Volley。
1.Volley本地緩存為何有時候不會進行緩存?
緩存使用條件http://www.jyygyx.com/server/必須支持,緩存,配置Cache-Control頭信息,
由于Volley需要從這些頭信息判斷緩存是不是已過期。如果已過期Volley將會重新從網絡獲得數據。
本人用抓包工具抓了沒法緩存的返回頭信息

可以支持緩存的頭信息

2.如果我們自己寫1個網絡要求框架,我們內部實現會選擇使用HttpURLConnection還是HttpClient?
我們通過源碼來看看Volley是如何選擇使用的
public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}
if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}
Network network = new BasicNetwork(stack);
RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
queue.start();
return queue;
}
這里會判斷如果手機系統版本號是大于9(Android 2.3)的,則創建1個HurlStack的實例,否則就創建1個HttpClientStack的實例。實際上HurlStack的內部就是使用HttpURLConnection進行網絡通訊的,而HttpClientStack的內部則是使用HttpClient進行網絡通訊的,這里為何這樣選擇呢?參考文章:Android訪問網絡,使用HttpURLConnection還是HttpClient?這就是它為什么這么快的緣由。
從這點我們可以學習到,要針對不同SDK版本做去相應更優的處理方式,這樣才能到達最好的效果。
3.Volley給我們提供了ImageRrequest,ImageLoader,NetworkImageView,它們分別使用于甚么場景為何?
單張圖片的加載可以通過發起
ImageReuqst 要求來實現,但為了利用內存緩存,推薦使用 ImageLoader
NetwoekImageView專門用于批量圖片加載的場景:
public class NetworkImageView extends ImageView {
private String mUrl;
// 默許顯示的圖片
private int mDefaultImageId;
// 加載失敗時顯示的圖片
private int mErrorImageId;
// 主方法入口
public void setImageUrl(String url, ImageLoader imageLoader) {
mUrl = url;
mImageLoader = imageLoader;
// 這個方法將會對ImageView的尺寸是不是有效、是不是為同1張圖片進行判斷
// 在履行新要求前,也會取消上1次在這個View里啟動的另外一個已失效的要求
// 由于篇幅的限制和代碼行數太多,這里不貼出具體實現的代碼
loadImageIfNecessary(false);
}
// 如果圖片已滑離屏幕,變成不可見,將履行取消要求的操作
@Override
protected void onDetachedFromWindow() {
if (mImageContainer != null) mImageContainer.cancelRequest();
super.onDetachedFromWindow();
}
}
在ListView加載多張圖片的時候,NetworkImageView可以避免出現圖片毛病的現象,和當
NetworkImageView滑出屏幕的時候會取消加載圖片要求,這樣就保證加載多張圖片的時候用戶快速滑動列表的流暢性。給用戶帶來更優的體驗。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈