1. 程式人生 > >Volley網路框架使用過程中的一些報錯解決辦法。

Volley網路框架使用過程中的一些報錯解決辦法。

今天第一次開始使用Volley網路框架,的確使用十分便利。大致的使用步驟如下:
1.建立一個RequestQueue物件。
2.建立一個StringRequest或者JsonRequest物件
3.將步驟2建立的物件新增到RequestQueue裡面
相比於以前使用HttpUrlConnection和HttpClient的方法,的確減少了不少的程式碼工作量,不過即便如此簡單的使用步驟,仍然出現不少令人頭疼的問題。
且看下面程式碼:

JsonObjectRequest jsonObjectRequest=new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html"
,null, new Response.Listener<JSONObject>(){ public void onResponse(JSONObject response){ Log.d("TAG",response.toString()); } },new Response.ErrorListener(){ @Override public void
onErrorResponse(VolleyError volleyError) { Log.e("TAG",volleyError.getMessage(),volleyError); } }); mQueue.add(jsonObjectRequest);

這裡簡單new出了一個JsonObjectRequest物件,url地址是中國天氣網提供的一個查詢天氣資訊的介面,期待在logcat中打印出來。沒想到居然給我報錯:

07-29 13:09:57.642 11615-11615/com.example
.leslie.volleytest E/TAG: null com.android.volley.AuthFailureError at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:142) at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)

AuthFailureError我查了一下,是許可權錯誤,訪問了不可用的資源被伺服器拒絕,這樣應該是我提供的URL地址有問題了,果然,我複製貼上到瀏覽器顯示403錯誤。
這裡寫圖片描述

然後我心想這下該沒問題了吧?沒想到又出現了新的錯誤:

07-30 00:15:54.499 1869-5984/com.example.leslie.volleytest E/Volley: [83] BasicNetwork.performRequest: Unexpected response code 200 for http://www.weather.com.cn/data/sk/101010100.html
07-29 13:30:21.151 7357-7357/com.example.leslie.volleytest E/TAG: null
                                                                  com.android.volley.NetworkError
                                                                      at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:148)
                                                                      at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)

NetWorkError和No Connection Error有什麼不同了?Google一下發現一條解釋如下:
No connection Error - you doesn’t have a data connection and wi-fi Connection

Network Error - you may login with some wi-fi which is under firewall means you are connected but not able to transfer data. you are allowed to transfer only even after login manually with the firewall.Before login to firewall the network error is displayed

翻譯一下就是:
No connection Error 就是你沒有資料連線或者WiFi連線。
NetWork Error 就像 你可能登入上某些防火牆wifi,這意味著你能連上wifi但是不能傳輸資料。只有手動登入防火牆你才可以傳輸資料,但在此之前,NetWork錯誤就會出現。

看到一篇文章

http://www.cnblogs.com/xiaorenwu702/p/4541950.html
裡面介紹了常見的一些VolleyError出現的原因,現在引用如下:
正如前面程式碼看到的,在建立一個請求時,需要新增一個錯誤監聽onErrorResponse。如果請求發生異常,會返回一個VolleyError例項。
以下是Volley的異常列表:
1.AuthFailureError:如果在做一個HTTP的身份驗證,可能會發生這個錯誤。
2.NetworkError:Socket關閉,伺服器宕機,DNS錯誤都會產生這個錯誤。
3.NoConnectionError:和NetworkError類似,這個是客戶端沒有網路連線。
4.ParseError:在使用JsonObjectRequest或JsonArrayRequest時,如果接收到的JSON是畸形,會產生異常。
5.SERVERERROR:伺服器的響應的一個錯誤,最有可能的4xx或5xx HTTP狀態程式碼。
6.TimeoutError:Socket超時,伺服器太忙或網路延遲會產生這個異常。預設情況下,Volley的超時時間為2.5秒。如果得到這個錯誤可以使用RetryPolicy。

按照上面的說法,那應該是伺服器的原因了,我猜想還是URL的原因,換成順豐的物流介面就可以正常解析了:

http://www.kuaidi100.com/query?type=快遞公司代號&postid=快遞單號 

可是我搞不懂,為什麼返回碼是200還報錯,在網上查到說是返回碼是200表示伺服器正常接受請求並返回,百度了很久,沒有一個滿意的答案。都是些似是而非的回答。

不過據我以上的分析和推測,200應該是Url沒問題的,瀏覽器能開啟。但是模擬器仍然出現Network Error我認為是模擬器防火牆把網址遮蔽了。如果有高手把這個問題解決了,歡迎留言。