多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android Volley框架詳解

Android Volley框架詳解

來源:程序員人生   發布時間:2014-10-13 03:06:43 閱讀次數:2516次

注:文章出自http://blog.csdn.net/guolin_blog/article/details/17482095,有興趣可以先去閱讀。

Volley簡介

對于Android系統網絡通信,我們知道目前用的最普遍的就是HttpClient和HttpURLConnection,但是HttpURLConnection和HttpClient的用法還是稍微有些復雜的,需要我們去封裝代碼,減少冗余度。Google開發團隊也看到了這個問題,所以在2013年Google I/O大會上推出了一個新的網絡通信框架――Volley,Volley集成了AsyncHttpClient框架和Universal-Image-Loader為一體,在性能方面也進行了大幅度的調整,非常適合去進行數據量不大,但通信頻繁的網絡操作。

Volley下載

①.如果你的電腦安裝過git,請使用如下命令

git clone https://android.googlesource.com/platform/frameworks/volley

②.如果你的電腦沒安裝git,請到此地址下載

Volley使用流程

 ①.創建RequestQueue對象
 ②.創建Request對象
 ③.將Request對象加入RequestQueue

Volley自帶請求

 1.StringRequest ---請求字符串

private void requestStringData() { RequestQueue mRequestQueue = Volley.newRequestQueue(this); // 指定請求方式,攜帶請求參數 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處理流程之外,如果要添加請求參數的話,我們可以去重寫它的getParams方法。

2.JsonRequest ---請求Json對象

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 ---請求json數組

 略

4.ImageRequest ---請求圖片(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 ---請求圖片(2)

private void showImage2() { networkImageView.setVisibility(View.GONE); // 1. 創建一個RequestQueue對象。 RequestQueue mRequestQueue = Volley.newRequestQueue(this); // 2. 創建一個ImageLoader對象。 ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new BitmapCache()); // 3. 獲取一個ImageListener對象。 ImageListener imageListener = ImageLoader.getImageListener(imageView, R.drawable.image_default, R.drawable.image_error); // 4. 調用ImageLoader的get()方法加載網絡上的圖片。 //mImageLoader.get("http://www.baidu.com/img/bdlogo.png", imageListener); mImageLoader.get("http://www.baidu.com/img/bdlogo.png", imageListener, 200, 200); }

6.NetworkImageView ---請求圖片(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. 創建一個RequestQueue對象。 RequestQueue mRequestQueue = Volley.newRequestQueue(this); //2. 創建一個ImageLoader對象。 ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new BitmapCache()); //3. 在布局文件中添加一個NetworkImageView控件。 //4. 在代碼中獲取該控件的實例。 //5. 設置要加載的圖片地址。 networkImageView.setDefaultImageResId(R.drawable.image_default); networkImageView.setErrorImageResId(R.drawable.image_error); networkImageView.setImageUrl("http://www.baidu.com/img/bdlogo.png", mImageLoader); }

指定自己的Volley請求(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 

注:需要導入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); }

框架運行機制


源代碼總結:

1. RequestQueue requestQueue = Volley.newRequestQueue(this);

 ①.stack == null,判斷這個版本9,確定使用HttpURLConnection還是HttpClient

 ②.根據stack創建NetWork對象

 ③.創建RequestQueue,并start<創建一個緩存線程CacheDispatcher和四個網絡線程NetworkDispatcher>

2. requestQueue.add(request);

 ①.判斷是否可以緩存,如果可以,加入緩存隊列,否則,加入網絡請求隊列。request.setShouldCache(false);
 ②.緩存線程會一直在后臺運行,不斷的取出響應結果,是否為null,是否過期,兩者不成立則Request.parseNetworkResponse()
 ③.網絡請求線程也是在不斷的運行的,會調用Network.performRequest()去發送請求,將請求結果封裝成NetworkResponse對象返回
 ④.調用Request.parseNetworkResponse解析NetworkResponse
 ⑤.調用ExecutorDelivery.postResponse()回調解析出的數據
 ⑥.調用Request.deliverResponse()方法
 ⑦.最后我們再在這個方法中將響應的數據回調到Response.Listener的onResponse()方法

Volley1源碼下載(StringRequest,JsonRequest,JsonArrayRequest)

Volley2源碼下載(ImageRequest,ImageLoader,NetWorkImageView)

Volley3源碼下載(XmlRequest,GsonRequest)

Volley4源碼下載(運行機制)

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美一区二区三区四区视频 | 精品欧美日韩一区二区 | 亚洲地址一地址二地址三 | 日韩欧美亚洲综合 | 一本大道道无香蕉综合在线 | 中文在线播放 | 在线欧美不卡 | 欧美在线天堂 | 欧美精品video| 国产亚洲精品福利在线 | 成人精品视频在线 | 美女福利在线 | 不卡精品国产_亚洲人成在线 | 俺来操| 亚洲久久天堂 | 亚洲高清中文字幕 | 美美女高清毛片视频黄的一免费 | 非洲黑人最猛性xxxx交 | 美女福利视频国产免费观看 | 亚洲天堂一区二区 | 亚洲精品一区二区三区在线观看 | 一级久久 | 中文字幕乱码中文字幕 | 日韩欧美亚洲综合一区二区 | 成人国内精品久久久久影 | 亚洲视频在线网站 | jizz毛片| 亚洲激情在线播放 | 国产一级做a爰片久久毛片99 | 亚洲欧洲日韩国产 | 国产叼嘿视频在线观看 | 亚洲我射 | 国产亚洲福利精品一区二区 | 欧美高清在线视频在线99精品 | 色人阁在线| 久久中文字幕亚洲精品最新 | 日本不卡免费新一二三区 | 国产成在线观看免费视频成本人 | 日本一区二区三区四区五区 | 国产精品自在线 | 欧美最猛黑人xxxx黑人猛交98 |