Android Volley框架詳解
來源:程序員人生 發(fā)布時(shí)間:2014-10-13 03:06:43 閱讀次數(shù):2524次
注:文章出自http://blog.csdn.net/guolin_blog/article/details/17482095,有興趣可以先去閱讀。
Volley簡(jiǎn)介
對(duì)于Android系統(tǒng)網(wǎng)絡(luò)通信,我們知道目前用的最普遍的就是HttpClient和HttpURLConnection,但是HttpURLConnection和HttpClient的用法還是稍微有些復(fù)雜的,需要我們?nèi)シ庋b代碼,減少冗余度。Google開發(fā)團(tuán)隊(duì)也看到了這個(gè)問題,所以在2013年Google
I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架――Volley,Volley集成了AsyncHttpClient框架和Universal-Image-Loader為一體,在性能方面也進(jìn)行了大幅度的調(diào)整,非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作。
Volley下載
①.如果你的電腦安裝過git,請(qǐng)使用如下命令
git clone https://android.googlesource.com/platform/frameworks/volley
②.如果你的電腦沒安裝git,請(qǐng)到此地址下載
Volley使用流程
①.創(chuàng)建RequestQueue對(duì)象
②.創(chuàng)建Request對(duì)象
③.將Request對(duì)象加入RequestQueue
Volley自帶請(qǐng)求
1.StringRequest
---請(qǐng)求字符串
private void requestStringData() {
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
// 指定請(qǐng)求方式,攜帶請(qǐng)求參數(shù)
StringRequest mRequest = new StringRequest(Method.POST, "http://www.baidu.com", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, error.getMessage(), error);
}
}
) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> mParams = new HashMap<String, String>();
mParams.put("params1", "value1");
mParams.put("params2", "value2");
return mParams;
}
};
mRequestQueue.add(mRequest);
}
除了我們上面講到的Volley處理流程之外,如果要添加請(qǐng)求參數(shù)的話,我們可以去重寫它的getParams方法。
2.JsonRequest
---請(qǐng)求Json對(duì)象
private void requestJosnObjectData() {
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage(), error);
}
});
mRequestQueue.add(jsonObjectRequest);
}
3.JsonArrayRequest
---請(qǐng)求json數(shù)組
略
4.ImageRequest
---請(qǐng)求圖片(1)
private void showImage() {
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
ImageRequest mImageRequest = new ImageRequest("http://www.baidu.com/img/bdlogo.png", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i(TAG, error.getMessage(), error);
}
});
mRequestQueue.add(mImageRequest);
}
5.ImageLoader
---請(qǐng)求圖片(2)
private void showImage2() {
networkImageView.setVisibility(View.GONE);
// 1. 創(chuàng)建一個(gè)RequestQueue對(duì)象。
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
// 2. 創(chuàng)建一個(gè)ImageLoader對(duì)象。
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new BitmapCache());
// 3. 獲取一個(gè)ImageListener對(duì)象。
ImageListener imageListener = ImageLoader.getImageListener(imageView, R.drawable.image_default, R.drawable.image_error);
// 4. 調(diào)用ImageLoader的get()方法加載網(wǎng)絡(luò)上的圖片。
//mImageLoader.get("http://www.baidu.com/img/bdlogo.png", imageListener);
mImageLoader.get("http://www.baidu.com/img/bdlogo.png", imageListener, 200, 200);
}
6.NetworkImageView
---請(qǐng)求圖片(3)
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/iv_network"
android:layout_width="200dp"
android:layout_height="200dp" >
</com.android.volley.toolbox.NetworkImageView>
private void showImage3() {
imageView.setVisibility(View.GONE);
//1. 創(chuàng)建一個(gè)RequestQueue對(duì)象。
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
//2. 創(chuàng)建一個(gè)ImageLoader對(duì)象。
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new BitmapCache());
//3. 在布局文件中添加一個(gè)NetworkImageView控件。
//4. 在代碼中獲取該控件的實(shí)例。
//5. 設(shè)置要加載的圖片地址。
networkImageView.setDefaultImageResId(R.drawable.image_default);
networkImageView.setErrorImageResId(R.drawable.image_error);
networkImageView.setImageUrl("http://www.baidu.com/img/bdlogo.png", mImageLoader);
}
指定自己的Volley請(qǐng)求(XmlRequest )
public class XMLRequest extends Request<XmlPullParser> {
private final Listener<XmlPullParser> mListener;
public XMLRequest(int method, String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public XMLRequest(String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
XmlPullParser xmlPullParser = Xml.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}
}
private void requestXml() {
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
XMLRequest xmlRequest = new XMLRequest("http://flash.weather.com.cn/wmaps/xml/china.xml", new Response.Listener<XmlPullParser>() {
@Override
public void onResponse(XmlPullParser response) {
XmlParser(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
mRequestQueue.add(xmlRequest);
}
指定自己Request(GsonRequest )
注:需要導(dǎo)入gson.jar
public class GsonRequest<T> extends Request<T> {
private final Listener<T> mListener;
private Gson mGson;
private Class<T> mClass;
public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = clazz;
mListener = listener;
}
public GsonRequest(String url, Class<T> clazz, Listener<T> listener, ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
private void requestGson() {
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
GsonRequest<Weather> gsonRequest = new GsonRequest<Weather>("http://www.weather.com.cn/data/sk/101010100.html", Weather.class, new Response.Listener<Weather>() {
@Override
public void onResponse(Weather weather) {
WeatherInfo weatherInfo = weather.getWeatherinfo();
Log.d(TAG, "city is " + weatherInfo.getCity());
Log.d(TAG, "temp is " + weatherInfo.getTemp());
Log.d(TAG, "time is " + weatherInfo.getTime());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mRequestQueue.add(gsonRequest);
}
框架運(yùn)行機(jī)制

源代碼總結(jié):
1. RequestQueue requestQueue = Volley.newRequestQueue(this);
①.stack
== null,判斷這個(gè)版本9,確定使用HttpURLConnection還是HttpClient
②.根據(jù)stack創(chuàng)建NetWork對(duì)象
③.創(chuàng)建RequestQueue,并start<創(chuàng)建一個(gè)緩存線程CacheDispatcher和四個(gè)網(wǎng)絡(luò)線程N(yùn)etworkDispatcher>
2. requestQueue.add(request);
①.判斷是否可以緩存,如果可以,加入緩存隊(duì)列,否則,加入網(wǎng)絡(luò)請(qǐng)求隊(duì)列。request.setShouldCache(false);
②.緩存線程會(huì)一直在后臺(tái)運(yùn)行,不斷的取出響應(yīng)結(jié)果,是否為null,是否過期,兩者不成立則Request.parseNetworkResponse()
③.網(wǎng)絡(luò)請(qǐng)求線程也是在不斷的運(yùn)行的,會(huì)調(diào)用Network.performRequest()去發(fā)送請(qǐng)求,將請(qǐng)求結(jié)果封裝成NetworkResponse對(duì)象返回
④.調(diào)用Request.parseNetworkResponse解析NetworkResponse
⑤.調(diào)用ExecutorDelivery.postResponse()回調(diào)解析出的數(shù)據(jù)
⑥.調(diào)用Request.deliverResponse()方法
⑦.最后我們?cè)僭谶@個(gè)方法中將響應(yīng)的數(shù)據(jù)回調(diào)到Response.Listener的onResponse()方法
Volley1源碼下載(StringRequest,JsonRequest,JsonArrayRequest)
Volley2源碼下載(ImageRequest,ImageLoader,NetWorkImageView)
Volley3源碼下載(XmlRequest,GsonRequest)
Volley4源碼下載(運(yùn)行機(jī)制)
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)