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

可以支持緩存的頭信息

2.如果我們自己寫1個網(wǎng)絡(luò)要求框架,我們內(nèi)部實現(xiàn)會選擇使用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;
}
這里會判斷如果手機(jī)系統(tǒng)版本號是大于9(Android 2.3)的,則創(chuàng)建1個HurlStack的實例,否則就創(chuàng)建1個HttpClientStack的實例。實際上HurlStack的內(nèi)部就是使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)通訊的,而HttpClientStack的內(nèi)部則是使用HttpClient進(jìn)行網(wǎng)絡(luò)通訊的,這里為何這樣選擇呢?參考文章:Android訪問網(wǎng)絡(luò),使用HttpURLConnection還是HttpClient?這就是它為什么這么快的緣由。
從這點我們可以學(xué)習(xí)到,要針對不同SDK版本做去相應(yīng)更優(yōu)的處理方式,這樣才能到達(dá)最好的效果。
3.Volley給我們提供了ImageRrequest,ImageLoader,NetworkImageView,它們分別使用于甚么場景為何?
單張圖片的加載可以通過發(fā)起
ImageReuqst 要求來實現(xiàn),但為了利用內(nèi)存緩存,推薦使用 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張圖片進(jìn)行判斷
// 在履行新要求前,也會取消上1次在這個View里啟動的另外一個已失效的要求
// 由于篇幅的限制和代碼行數(shù)太多,這里不貼出具體實現(xiàn)的代碼
loadImageIfNecessary(false);
}
// 如果圖片已滑離屏幕,變成不可見,將履行取消要求的操作
@Override
protected void onDetachedFromWindow() {
if (mImageContainer != null) mImageContainer.cancelRequest();
super.onDetachedFromWindow();
}
}
在ListView加載多張圖片的時候,NetworkImageView可以避免出現(xiàn)圖片毛病的現(xiàn)象,和當(dāng)
NetworkImageView滑出屏幕的時候會取消加載圖片要求,這樣就保證加載多張圖片的時候用戶快速滑動列表的流暢性。給用戶帶來更優(yōu)的體驗。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈