Android Volley完全解析(三),定製自己的Request
原文連結 http://blog.csdn.net/guolin_blog/article/details/17612763
經過前面兩篇文章的學習,我們已經掌握了Volley各種Request的使用方法,包括StringRequest、JsonRequest、ImageRequest等。其中StringRequest用於請求一條普通的文字資料,JsonRequest(JsonObjectRequest、JsonArrayRequest)用於請求一條JSON格式的資料,ImageRequest則是用於請求網路上的一張圖片。
可是Volley提供給我們的Request型別就只有這麼多,而我們都知道,在網路上傳輸的資料通常有兩種格式,JSON和XML,那麼如果想要請求一條XML格式的資料該怎麼辦呢?其實很簡單,Volley提供了非常強的擴充套件機制,使得我們可以很輕鬆地定製出任意型別的Request,這也就是本篇文章的主題了。
1. 自定義XMLRequest
下面我們準備自定義一個XMLRequest,用於請求一條XML格式的資料。那麼該從哪裡開始入手呢?額,好像是有些無從下手。遇到這種情況,我們應該去參考一下Volley的原始碼,看一看StringRequest是怎麼實現的,然後就可以模仿著寫出XMLRequest了。首先看下StringRequest的原始碼,如下所示:
- /**
- * A canned request for retrieving the response body at a given URL as a String.
- */
-
public
- privatefinal Listener<String> mListener;
- /**
- * Creates a new request with the given method.
- *
- * @param method the request {@link Method} to use
- * @param url URL to fetch the string at
-
* @param listener Listener to receive the String response
- * @param errorListener Error listener, or null to ignore errors
- */
- public StringRequest(int method, String url, Listener<String> listener,
- ErrorListener errorListener) {
- super(method, url, errorListener);
- mListener = listener;
- }
- /**
- * Creates a new GET request.
- *
- * @param url URL to fetch the string at
- * @param listener Listener to receive the String response
- * @param errorListener Error listener, or null to ignore errors
- */
- public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
- this(Method.GET, url, listener, errorListener);
- }
- @Override
- protectedvoid deliverResponse(String response) {
- mListener.onResponse(response);
- }
- @Override
- protected Response<String> parseNetworkResponse(NetworkResponse response) {
- String parsed;
- try {
- parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
- } catch (UnsupportedEncodingException e) {
- parsed = new String(response.data);
- }
- return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
- }
- }
可以看到,StringRequest的原始碼很簡練,根本就沒幾行程式碼,我們一起來分析下。首先StringRequest是繼承自Request類的,Request可以指定一個泛型類,這裡指定的當然就是String了,接下來StringRequest中提供了兩個有參的建構函式,引數包括請求型別,請求地址,以及響應回撥等,由於我們已經很熟悉StringRequest的用法了,相信這幾個引數的作用都不用再解釋了吧。但需要注意的是,在建構函式中一定要呼叫super()方法將這幾個引數傳給父類,因為HTTP的請求和響應都是在父類中自動處理的。
另外,由於Request類中的deliverResponse()和parseNetworkResponse()是兩個抽象方法,因此StringRequest中需要對這兩個方法進行實現。deliverResponse()方法中的實現很簡單,僅僅是呼叫了mListener中的onResponse()方法,並將response內容傳入即可,這樣就可以將伺服器響應的資料進行回調了。parseNetworkResponse()方法中則應該對伺服器響應的資料進行解析,其中資料是以位元組的形式存放在NetworkResponse的data變數中的,這裡將資料取出然後組裝成一個String,並傳入Response的success()方法中即可。
瞭解了StringRequest的實現原理,下面我們就可以動手來嘗試實現一下XMLRequest了,程式碼如下所示:
- publicclass XMLRequest extends Request<XmlPullParser> {
- privatefinal 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));
- XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- XmlPullParser xmlPullParser = factory.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
- protectedvoid deliverResponse(XmlPullParser response) {
- mListener.onResponse(response);
- }
- }
可以看到,其實並沒有什麼太多的邏輯,基本都是仿照StringRequest寫下來的,XMLRequest也是繼承自Request類的,只不過這裡指定的泛型類是XmlPullParser,說明我們準備使用Pull解析的方式來解析XML。在parseNetworkResponse()方法中,先是將伺服器響應的資料解析成一個字串,然後設定到XmlPullParser物件中,在deliverResponse()方法中則是將XmlPullParser物件進行回撥。
好了,就是這麼簡單,下面我們嘗試使用這個XMLRequest來請求一段XML格式的資料。http://flash.weather.com.cn/wmaps/xml/china.xml這個介面會將中國所有的省份資料以XML格式進行返回,如下所示:
- <chinadn="day"slick-uniqueid="3">
- <cityquName="黑龍江"pyName="heilongjiang"cityname="哈爾濱"state1="0"state2="0"stateDetailed="晴"tem1="18"tem2="6"windState="西北風3-4級轉西風小於3級"/>
- <cityquName="吉林"pyName="jilin"cityname="長春"state1="0"state2="0"stateDetailed="晴"tem1="19"tem2="6"windState="西北風3-4級轉小於3級"/>
- <cityquName="遼寧"pyName="liaoning"cityname="瀋陽"state1="0"state2="0"stateDetailed="晴"tem1="21"tem2="7"windState="東北風3-4級"/>
-
<cityquName="海南"pyName="hainan"cityname="海口"state1="1"state2=
相關推薦
Android Volley完全解析(三),定製自己的Request
原文連結 http://blog.csdn.net/guolin_blog/article/details/17612763 經過前面兩篇文章的學習,我們已經掌握了Volley各種Request的使用方法,包括StringRequest、JsonRequest
Android Volley完全解析 四 ,帶你從原始碼的角度理解Volley
經過前三篇文章的學習,Volley的用法我們已經掌握的差不多了,但是對於Volley的工作原理,恐怕有很多朋友還不是很清楚。因此,本篇文章中我們就來一起閱讀一下Volley的原始碼,將它的工作流程整體地梳理一遍。同時,這也是Volley系列的最後一篇文章了。其實,Volley的
Android Volley完全解析(一),初識Volley的基本用法
1. Volley簡介我們平時在開發Android應用的時候不可避免地都需要用到網路技術,而多數情況下應用程式都會使用HTTP協議來發送和接收網路資料。Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和HttpClient,幾乎在任
Android Volley完全解析(二),使用Volley載入網路圖片
在上一篇文章中,我們瞭解了Volley到底是什麼,以及它的基本用法。本篇文章中我們即將學習關於Volley更加高階的用法,如何你還沒有看過我的上一篇文章的話,建議先去閱讀Android Volley完全解析(一),初識Volley的基本用法。在上篇文章中有提到過,Volley
Android-volley完全解析
1. Volley簡介 我們平時在開發Android應用的時候不可避免地都需要用到網路技術,而多數情況下應用程式都會使用HTTP協議來發送和接收網路資料。Android系統中主要提供了兩種方式來進行HTTP通訊,HttpURLConnection和HttpClie
Android屬性動畫完全解析(上),初識屬性動畫的基本用法
fcm 操作 fad 擴展性 改變 內部使用 如果 轉載 @override 轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/43536355 在手機上去實現一些動畫效果算是件比較炫酷的事情,因此Andr
Android Service完全解析,關於服務你所需知道的一切(下)
並且 無法 數據類型 界面 其它 wid logcat listen 程序崩潰 文章轉載至:http://blog.csdn.net/guolin_blog/article/details/9797169 這是郭霖寫的.......就是寫 "第一行代碼"的那個厲害人物,大
Android Service完全解析,關於服務你所需知道的一切(上)(筆記)
參考原文:Android Service完全解析,關於服務你所需知道的一切(上) Service的基本用法 然後新建一個MyService繼承自Service,並重寫父類的onCreate()、onStartCommand()和onDestroy()方法, 可以看到,在Sta
Android屬性動畫完全解析 中 ,ValueAnimator和ObjectAnimator的高階用法
轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章當中,我們學習了Android屬性動畫的基本用法,當然也是最常用的一些用法,這些用法足以覆蓋我們平時大多情況下的動畫需求了。但是,正如上篇文章當中所
Android屬性動畫完全解析 下 ,Interpolator和ViewPropertyAnimator的用法
大家好,歡迎繼續回到Android屬性動畫完全解析。在上一篇文章當中我們學習了屬性動畫的一些進階技巧,包括ValueAnimator和ObjectAnimator的高階用法,那麼除了這些之外,當然還有一些其它的高階技巧在等著我們學習,因此本篇文章就對整個屬性動畫完全解析系列收個
Android Fragment完全解析,關於碎片你所需知道的一切
我們都知道,Android上的介面展示都是通過Activity實現的,Activity實在是太常用了,我相信大家都已經非常熟悉了,這裡就不再贅述。但是Activity也有它的侷限性,同樣的介面在手機上顯示可能很好看,在平板上就未必了,因為平板的螢幕非常大,手機的介面放在平板上
Android Scroller完全解析,關於Scroller你所需知道的一切
轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/48719871 2016大家新年好!這是今年的第一篇文章,那麼應CSDN工作人員的建議,為了能給大家帶來更好的閱讀體驗,我也是將部落格換成了寬屏
Android屬性動畫完全解析(中),ValueAnimator和ObjectAnimator的高階用法
大家好,在上一篇文章當中,我們學習了Android屬性動畫的基本用法,當然也是最常用的一些用法,這些用法足以覆蓋我們平時大多情況下的動畫需求了。但是,正如上篇文章當中所說到的,屬性動畫對補間動畫進行了很大幅度的改進,之前補間動畫可以做到的屬性動畫也能做到,補間動畫做不到的現在
Android Service完全解析,關於服務你所需知道的一切(上)
相信大多數朋友對Service這個名詞都不會陌生,沒錯,一個老練的Android程式設計師如果連Service都沒聽說過的話,那確實也太遜了。Service作為Android四大元件之一,在每一個應用程式中都扮演著非常重要的角色。它主要用於在後臺處理一些耗時的邏輯,或者去執行
Android屬性動畫完全解析(下),Interpolator和ViewPropertyAnimator的用法
大家好,歡迎繼續回到Android屬性動畫完全解析。在上一篇文章當中我們學習了屬性動畫的一些進階技巧,包括ValueAnimator和ObjectAnimator的高階用法,那麼除了這些之外,當然還有一些其它的高階技巧在等著我們學習,因此本篇文章就對整個屬性動畫完全解析系列收
Android 網路通訊框架Volley完全解析(一)
Volley簡介及Request基本用法 Google I/O 2013上,Volley釋出了。Volley是Android平臺上的網路通訊庫,能使網路通訊更快,更簡單,更健壯。這是Volley名
Android DiskLruCache完全解析,硬碟快取的最佳方案
概述記得在很早之前,我有寫過一篇文章Android高效載入大圖、多圖解決方案,有效避免程式OOM,這篇文章是翻譯自Android Doc的,其中防止多圖OOM的核心解決思路就是使用LruCache技術。但LruCache只是管理了記憶體中圖片的儲存與釋放,如果圖片從記憶體中被
Android ActionBar完全解析,使用官方推薦的最佳導航欄(下)
本篇文章主要內容來自於Android Doc,我翻譯之後又做了些加工,英文好的朋友也可以直接去讀原文。限於篇幅的原因,在上篇文章中我們只學習了ActionBar基礎部分的知識,那麼本篇文章我們將接著上一章的內容繼續學習,探究一下ActionBar更加高階的知識。如果你還沒有看
Android Service完全解析,關於服務你所需知道的一切(上和下)
在上一篇文章中,我們學習了Android Service相關的許多重要內容,包括Service的基本用法、Service和Activity進行通訊、Service的銷燬方式、Service與Thread的關係、以及如何建立前臺Service。以上所提到的這些知識點,基本上涵蓋了大部分日常開發工作當
Android AsyncTask完全解析,帶你從原始碼的角度徹底理解
我們都知道,Android UI是執行緒不安全的,如果想要在子執行緒裡進行UI操作,就需要藉助Android的非同步訊息處理機制。之前我也寫過了一篇文章從原始碼層面分析了Android的非同步訊息處理機制,感興趣的朋友可以參考 Android Handler、Message完