Volley用法完全解析
從上圖可以看到Volley分為三個(gè)線程柄瑰,分別是主線程闸氮、緩存調(diào)度線程、和網(wǎng)絡(luò)調(diào)度線程教沾,首先請(qǐng)求會(huì)加入緩存隊(duì)列蒲跨,如果發(fā)現(xiàn)可以找到相應(yīng)的緩存結(jié)果就直接讀取緩存并解析,然后回調(diào)給主線程授翻;如果在緩存中沒(méi)有找到結(jié)果隆箩,則將這條請(qǐng)求加入到網(wǎng)絡(luò)隊(duì)列中杨蛋,然后發(fā)送HTTP請(qǐng)求,解析響應(yīng)并寫(xiě)入緩存寇荧,并回調(diào)給主線程。
Volley簡(jiǎn)介:
2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架Volley。Volley既可以訪問(wèn)網(wǎng)絡(luò)取得數(shù)據(jù)烁设,也可以加載圖片,并且在性能方面也進(jìn)行了大幅度的調(diào)整恋谭,它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大滞谢,但通信頻繁的網(wǎng)絡(luò)操作母截,而對(duì)于大數(shù)據(jù)量的網(wǎng)絡(luò)操作喘漏,比如說(shuō)下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕。
Volley用法:
Volley請(qǐng)求網(wǎng)絡(luò)都是基于請(qǐng)求隊(duì)列的返十,開(kāi)發(fā)者只要把請(qǐng)求放在請(qǐng)求隊(duì)列中就可以了,請(qǐng)求隊(duì)列會(huì)依次進(jìn)行請(qǐng)求,一般情況下逢慌,一個(gè)應(yīng)用程序如果網(wǎng)絡(luò)請(qǐng)求沒(méi)有特別頻繁則完全可以只有一個(gè)請(qǐng)求隊(duì)列(對(duì)應(yīng)Application)鉴象,如果非常多或其他情況纺弊,則可以是一個(gè)Activity對(duì)應(yīng)一個(gè)網(wǎng)絡(luò)請(qǐng)求隊(duì)列,這就要看具體情況了
1.首先創(chuàng)建隊(duì)列:
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
2.StringRequest的用法:
//創(chuàng)建請(qǐng)求隊(duì)列 ? ? ?
?RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());? ? ? ? StringRequest mStringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com", ? ?new Response.Listener() {
@Override
public void onResponse(String response) {
Log.i("wangshu", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("wangshu", error.getMessage(), error);
}
});
//將請(qǐng)求添加在請(qǐng)求隊(duì)列中
mQueue.add(mStringRequest);
請(qǐng)求的結(jié)果是百度的網(wǎng)頁(yè)文件腊脱。
3.JsonRequest的用法:
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());? ? ? ? JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST,"http://api.1-blog.com/biz/bizserver/article/list.do",? ? ? ? ? ? ? ? new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
Log.d("buxq", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("buxq", error.getMessage(), error);
}
}
);
mQueue.add(mJsonObjectRequest);
運(yùn)行程序返回的是一堆新聞的Json數(shù)據(jù),解析的話可以用Gson杜耙,這里不介紹了浆兰。
4.使用ImageRequest加載圖片:
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());? ? ? ? ImageRequest imageRequest = new ImageRequest(? ? ? ? ? ? ? ? "http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg",? ? ? ? ? ? ? ? new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
iv_image.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
iv_image.setImageResource(R.drawable.ico_default);
}
});
mQueue.add(imageRequest);
請(qǐng)求圖片是可以設(shè)置期望的圖片大小的蜕便,如果圖片超過(guò)預(yù)期尺寸,會(huì)壓縮完再返回。
5.配合ImageLoader加載圖片:
ImageLoader的內(nèi)部使用ImageRequest來(lái)實(shí)現(xiàn)仿荆,它的構(gòu)造器可以傳入一個(gè)ImageCache緩存形參舶替,實(shí)現(xiàn)了圖片緩存的功能舔庶,同時(shí)還可以過(guò)濾重復(fù)鏈接惕橙,避免重復(fù)發(fā)送請(qǐng)求惶凝。
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_image,R.drawable.ico_default, R.drawable.ico_default);
imageLoader.get("http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg", listener);