【FastDev4Android框架開發】Volley完全解析之基礎使用(二十六)
轉載請標明出處:
(一).前言:
【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org
對於網路框架這部分,其實也一直想寫點東西總結一下,很長的一段時間對於網路請求這塊,在我剛開始做Android開發的時候還是2.2,2.3版本居多,那時候我們的專案中經常使用的是HttpURLConnection和HTTPClient來進行HTTP通訊。不過這兩種方式的用法有很多複雜的地方,我們在實際使用中都要進行封裝,一個HTTP請求自定義封裝工具類,方法一多一般就是幾百行或者幾千行程式碼,這樣如果封裝不好就會出現很多重複的程式碼甚至Bug。慢慢的就出現了很多網路請求框架例如
從我這邊的角度來講,我這邊專案網路請求這塊的演變如下:HttpURLConnection,HTTPClient->Volley->Okhttp。所以我這邊會把Volley和Okhttp這兩個框架的使用,進階,分裝都會講一遍,也方便初學者或者各位能夠學會使用以及明白相關的原理。
Volley系列教程大綱如下:
- Volley完全解析之基礎
- Volley完全解析之進階
- Volley完全解析之原始碼分析
今天我們首先來進入Volley
(二).Volley基本介紹:
2.1.Volley簡介:
2013年Google I/O大會的時候GoogleAndroid開發團隊推出了一個新網路資料請求框架Volley網路通訊庫,它能夠使得通訊速度更加快,更加簡單以及更健壯。看一下官網的釋出圖片:
發射火弓箭的圖有點類似流星,從這幅圖我們可以看出來Volley比較適合資料量不大但是通訊頻繁的場景。它當初的設計目標就是非常適合去進行資料量不大,但是網路通訊比較頻繁的操作。但是如果資料量很大的網路例如:檔案下載這類的,Volley框架的效率就會比較差了。
2.2.Volley功能特點:
- 提供字串,文字,JSON圖片等資料的非同步下載,同時提供回撥介面
- Request請求的優先順序以及排序
- 網路請求,圖片等相關快取功能
- 網路請求cancel機制
- 和原生元件生命週期聯動機制(例如:Activity結束的時候,會取消掉網路請求)等
2.3.Volley框架依賴配置:
Volley庫地址為:https://android.googlesource.com/platform/frameworks/volley你可以使用git進行克隆一份,當然這個地址是被牆掉得。你也可以去github中進行clone下載;
然後採用library依賴的方式匯入專案,或者編譯成jar包,在進行引入。當然如果你使用的是AndroidStudioIDE,你可以直接新增以下依賴即可:
compile'com.mcxiaoke.volley:library:1.0.19'
在我們今天演示的例子專案中,我這邊直接採用庫依賴的方式,如果大家如果clone我這邊FastDev4Android專案,可以直接看到原始碼,便於後面我們對於原始碼的修改以及功能封裝。
(三).Volley使用講解:
OK有了上面的準備工作,我們現在開始正式使用Volley框架進行我們的網路請求,要實現網路資料請求主要要記住下面三步驟:
1.建立RequestQueue物件
2.建立XXRequest物件(XX代表String,JSON,Image等等)
3.把XXRequest物件新增到RequestQueue中即可
3.1.StringRequest使用
我們現在開始使用StringRequest來獲取文字字串資料,首先建立RequestQueue物件:
RequestQueue requestQueue=Volley.newRequestQueue(this);
該通過Volley的靜態方法newRequestQueue(Context)來獲取一個請求佇列物件,內部設計有請求快取,系統版本區分請求,並且設計適合於高併發。間接著建立StringRequest物件來發起HTTP請求,然後接收相應資料:
StringRequest stringRequest=new StringRequest(Request.Method.GET, "http://www.sina.com.cn", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tv_result.setVisibility(View.VISIBLE);
img_result.setVisibility(View.GONE);
tv_result.setText(response.toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
}
});
建立StringRequest物件傳入四個引數:
- 請求方法GET/POST/或者其他
- 請求伺服器的目標地址
- 伺服器資料成功響應回撥
- 伺服器資料失敗響應回撥
第三步,就是StringRequest請求物件加入請求佇列中(RequestQueue)
requestQueue.add(jsonObjectRequest);
以上就完成了StringRequest的請求操作,執行效果如下圖:
上面我們就是完成了StringRequest的請求一種例項,不過上面只是簡單的Get請求,Volley框架也還是支援Post請求,但是比較遺憾的是Volley框架沒有直接提供設定Post請求引數的方法,但是我們實現getParams()方法來新增引數,更加讓我們開發使用起來簡單的方法就是修改Volley框架原始碼,後面使用進階中我們會將到原始碼相關修改。現在我們繼續往下看。
3.2.JsonObjectRequest和JsonArrayRequest使用
JsonObjectRequest和JsonArrayRequest都是整合自JsonRequest,而JsonRequest又是Request的子類。所以我們使用起來還是和StringRequest的方式差不多。
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest(Request.Method.GET
, "http://interface.zttmall.com/update/mallUpdate",null,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Gson gson=new Gson();
tv_result.setVisibility(View.VISIBLE);
img_result.setVisibility(View.GONE);
tv_result.setText(gson.fromJson(response.toString(),UpdateBean.class).toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(jsonObjectRequest);
這邊例子是請求一個地址,返回的是JSON資料格式的資料,我們這邊使用還定義了一個UpdateBean實體類,使用Gson來對資料進行解析,最後把物件打印出來。效果如下:
檢視以上的onResponse(JSONObject object)回撥方法,傳入引數為JSONObject物件,因為我們的介面返回就是單條的JSON資料,內部已經把JSON資料格式化成JSONObject物件了。得到物件我們直接解析即可。至於JsonArrayRequest的使用和JsonRequest使用差不多,一個單條,一個是多條而已。這邊就不演示了。
3.3.ImageRequest使用
學完上面的文字,josn等資料的載入,現在我們來看一下圖片的載入模組了,Volley對於圖片載入也給我們提供相應的工具類以及相關方法,主要是以下三種:
- ImageRequest
- ImageLoder
- NetWorkImageView
下面我們來分別學習一下這三種圖片載入方法,首先講一下ImageRequest
ImageRequest也是繼承自Request類,用法步驟和上面的三步驟戰略差不多,整體程式碼如下:
ImageRequest imageRequest=new ImageRequest("http://interface.zttmall.com/Images/upload/image/20150325/20150325083110_0898.jpg"
, newResponse.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
tv_result.setVisibility(View.GONE);
img_result.setVisibility(View.VISIBLE);
img_result.setImageBitmap(response);
}
}, 300, 300,ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, newResponse.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(imageRequest);
建立ImageRequest物件,然後加入到請求佇列中即可,ImageRequest建立的時候需要傳入一下引數:
- 圖片地址
- 圖片請求成功回撥
- 圖片設定寬
- 圖片設定高
- 圖片拉伸型別
- 圖片屬性
- 圖片請求失敗回撥
最後ImageRequest物件新增到請求佇列中即可。然後載入顯示圖片如下:
3.4.ImageLoader使用
現在我們來看圖片載入第二種方式使用ImageLoader,該類的使用方法就需要改變一下,因為ImageLoader可以把圖片快取結合進去,例如我們集合LruCache工具。所以整體來講還是比ImageRequest功能強大了一點。使用步驟如下:
- 建立RequestQueue請求佇列物件
- 建立ImageLoader圖片載入器物件
- 獲取ImageListener圖片監聽器
- 帶哦用ImageLoader.get()方法來進行載入圖片
下面我們來具體演示一下使用ImageLoder來載入圖片。
首先建立RequestQueue物件:
RequestQueue requestQueue=Volley.newRequestQueue(this);
建立ImageLoader物件,需要建立圖片快取器
packagecom.chinaztt.fdv;
importandroid.graphics.Bitmap;
importcom.android.volley.toolbox.ImageLoader;
/**
* 當前類註釋:圖片快取器,實現ImageLoder.ImageCache實現其中的方法,具體圖片怎麼樣快取讓我們自己來實現
* 這樣可以考慮到將來的擴充套件性
* 專案名:FastDev4Android
* 包名:com.chinaztt.fdv
* 作者:江清清 on 15/11/12 12:31
* 郵箱:[email protected]
* QQ: 781931404
* 公司:江蘇中天科技軟體技術有限公司
*/
public class Fdv_ImageCache implements ImageLoader.ImageCache {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmapbitmap) {
}
}
這邊我建立了一個Fdv_ImagCache類實現ImageLoader.ImageCache介面,並且實現其中的兩個方法,這樣圖片的快取具體方式讓我們使用者自己來實現,可以增強系統快取的可擴充套件性,自定義搞定。這邊我們暫時不具體實現方法直接給了空實現,後面的進階講解中會具體來將這些問題。下面為ImageLoader物件建立:
ImageLoader imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
分別傳入請求佇列,以及圖片快取器即可。
下邊獲取ImageListener監聽器:
ImageLoader.ImageListener listener=ImageLoader.getImageListener(img_result,R.drawable.ic_loading,R.drawable.ic_loading);
直接通過ImageLoader的靜態方法getImageListener()來進行獲取,傳入三個引數分別為:
- 需要實現圖片的控制元件imageview
- 正在載入過程中的預設圖片ID
- 圖片下載失敗顯示的圖片ID
最後使用ImageLoader呼叫get方法來下載並且顯示圖片
imageLoader.get("http://interface.zttmall.com//Images//upload//image//20150328//20150328105404_2392.jpg",listener);
OK這樣就搞定了,讓我們來看效果顯示:
3.5.NetworkImageView使用
最後我們來講一下第三種方式載入圖,NetworkImageView,該為自定義的ImageView控制元件,對ImageView的功能進行了擴充套件,加入了圖片下載的功能,具體使用方法如下:
- 建立RequestQueue物件
- 建立Imageloader物件
- 佈局檔案使用NetworkImageView自定義控制元件
- 使用獲取控制元件呼叫setImageUrl()方法即可
佈局檔案如下:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/img_result_network"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_centerHorizontal="true"/>
間接著建立ImageLoader物件:
ImageLoader network_imageLoader=new ImageLoader(requestQueue, new Fdv_ImageCache());
然後獲取NetworkImageView控制元件並且呼叫setimageUrl()方法如下:
img_result_network.setImageUrl("http://interface.zttmall.com//Images//upload//image//20150325//20150325083214_8280.jpg",network_imageLoader);
setImageUrl()傳入圖片地址以及圖片載入器imageloader,這樣就可以自動下載圖片並且進行顯示,不過在此之前,我們可以對該控制元件進行相關設定:setDefaultImageResId(), setErrorImageResId()分別設定預設載入圖片或者圖片下載失敗顯示圖片。
具體例項效果如下:
(四).結束語:
到此為止我們已經講完了Volley框架的基本介紹以及相關工具的使用(例如:StringRequest,JsonRequest,JsonArrayRequest,ImageRequest,ImageLoader,NetworkImageView等),具體例如Post請求引數修改,圖片快取器,使用最佳實踐等相關高階進階相關會在下一講中更新。具體例項和框架註釋過的全部程式碼已經上傳到FastDev4Android專案中了。
同時歡迎大家去Github站點進行clone或者下載瀏覽:
關注我的訂閱號,每天分享移動開發技術(Android/IOS),專案管理以及部落格文章!
關注我的微博,可以獲得更多精彩內容
相關推薦
【FastDev4Android框架開發】Volley完全解析之基礎使用(二十六)
轉載請標明出處:(一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org對於網路框架這
【FastDev4Android框架開發】RecyclerView完全解析之打造新版類Gallery效果(二十九)
轉載請標明出處:(一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 話說RecyclerView已經面市很久,也在很多應用中得到廣泛的使
【FastDev4Android框架開發】CardView完全解析與RecyclerView結合使用(三十二)
轉載請標明出處:(一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org作為Android L開始,Google更新的除了RecyclerView之外的另一控制元件
【FastDev4Android框架開發】HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造網易新聞Tab及滑動頁面效果(三十六)
轉載請標明出處:(一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 仿36Kr客戶端開發過程中,因為他們網站上面的新聞文章分類比較多,所以我
【FastDev4Android框架開發】重寫WebView網頁載入以及JavaScript注入詳解(二十三)
轉載請標明出處: (一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 今天我們來學習一下重寫WebView元件來實現網頁的載入,以及我們平時AP
【FastDev4Android框架開發】非常漂亮的進度指示器AVLoadingIndicatorView的使用講解(十八)
轉載請標明出處: (一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 今天我們的專案繼續更新,今天主要要加入一個非常漂亮的進度指示器AVLoading
【FastDev4Android框架開發】訊息匯流排EventBus的基本使用(二十)
轉載請標明出處: (一).前言: 【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org 今天我們的
【FastDev4Android框架開發】AndroidAnnnotations注入框架使用之最佳實踐SharedPreferences(十七)
轉載請標明出處: (一).前言: 前面我們已經對於AndroidAnnotations使用Adapters和lists做了講解,今天我們開始具體學習一下使用DI框架SharedPrefe
【安卓筆記】Volley全方位解析,帶你從原始碼的角度徹底理解
轉載請宣告原出處(blog.csdn.net/chdjj),謝謝! -------------------------- 參考資料 1.http://www.codekk.com/open-source-project-analysis/detail/Android/g
【Java Web開發】資料庫及SQL/MySQL基礎
詳細課程連結:【Java Web開發】資料庫及SQL/MySQL基礎 —— 阿里雲大學 MySQL概述 什麼是資料庫 ?
【零基礎】Python3學習課後練習題(二十六)
本文是跟著魚C論壇小甲魚零基礎學習Python3的視訊學習的,課後題也是跟隨每一課所附屬的題目來做的,根據自己的理解和標準答案記錄的筆記。 第二十九課 動動手: 0.編寫一個程式,接受使用
【Gin-API系列】Gin中介軟體之異常處理(六)
本文我們介紹生產環境上如何通過捕捉異常`recovery`來完善程式設計和提高使用者體驗。 # Golang異常處理 > golang 的異常處理比較簡單,通常都是在程式遇到異常崩潰`panic`之後通過`defer`呼叫延遲函式捕捉異常,並對異常資訊進行輸出和記錄。 * 異常處理程式碼 ```gol
Android學習之基礎知識十六 — Android開發高級技巧的掌握
學習android ava 調用 傳遞 手機遊戲 接口 自定義 默認值 具體實現 一、全局獲取Context的技巧 前面我們很多地方都使用到了Context,彈出Toast的時候、啟動活動的時候、發送廣播的時候、操作數據庫的時候、使用通知的時候等等。或許目前來說我們並沒
【ARM-Linux開發】U-Boot啟動過程--詳細版的完全分析
----------------------------------------------------------------------------------------------------------------------------------------
【Android 多媒體開發】 MediaPlayer 狀態機 介面 方法 解析
作者 : 韓曙亮一. MediaPlayer 狀態機 介紹Android MediaPlayer 狀態即圖例 : 1. Idle (閒置) 狀態 和 End (結束) 狀態MediaPlayer 物件宣告週期 : 從 Idle 到 End 狀態就是 MediaPlayer 整
Android 網路通訊框架Volley完全解析(一)
Volley簡介及Request基本用法 Google I/O 2013上,Volley釋出了。Volley是Android平臺上的網路通訊庫,能使網路通訊更快,更簡單,更健壯。這是Volley名
【ASP.NET開發】.NET三層架構簡單解析
這篇文章本來應該很早就寫出來的,但是一直苦於自己的精神能力有限,而且已經到了我們學校的考試周,所以時間上還是有點緊迫。關鍵的一點就是,找不到合理的思路來寫,思路沒有的話,就算是再好的素材,也寫不來大家喜歡的文章。 之前已經寫過關於.NET三層架的兩篇文章了,一篇是《【ASP
【 專欄 】- Picasso完全解析
Picasso完全解析 圖片載入利器之Picasso(一)初識 圖片載入利器之Picasso(二)基本用法 圖片載入利器之Picasso(三)進階 圖片載入利器之Picasso(四)原始碼解析 圖片載入利器之Picasso
【大數據開發】你知道大數據語言的工具與框架嗎?
新節點 java 學習曲線 定義 onf 團隊 工具 cal 儀表盤 為了解大數據的當前和未來狀態,我們采訪了來自28個組織的31位IT技術主管。我們問他們,“你在數據提取,分析和報告中使用的最流行的語言,工具和框架是什麽?” 以下的文章是他們告訴我們的記錄,經過總結如下。
【iOS越獄開發】怎樣將應用打包成.ipa文件
ria font 配置文件 例如 方法 col stat pack 應該 在項目開發中。我們經常須要將project文件打包成.ipa文件。提供給越獄的iphone安裝。 以下是一種方法: 1、首先應該給project安裝好配置文件(這裏不再敖述),在ios de