1. 程式人生 > >【FastDev4Android框架開發】Volley完全解析之基礎使用(二十六)

【FastDev4Android框架開發】Volley完全解析之基礎使用(二十六)

轉載請標明出處:

().前言:   

          【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org

對於網路框架這部分,其實也一直想寫點東西總結一下,很長的一段時間對於網路請求這塊,在我剛開始做Android開發的時候還是2.22.3版本居多,那時候我們的專案中經常使用的是HttpURLConnection和HTTPClient來進行HTTP通訊。不過這兩種方式的用法有很多複雜的地方,我們在實際使用中都要進行封裝,一個HTTP請求自定義封裝工具類,方法一多一般就是幾百行或者幾千行程式碼,這樣如果封裝不好就會出現很多重複的程式碼甚至Bug。慢慢的就出現了很多網路請求框架例如

:AsyncHttpClient,OkHttp,google親兒子Okhttp之類的。現在比較熱門的網路請求框架:Volley,Okhttp,這些已經在專案中得到很多的應用。

從我這邊的角度來講,我這邊專案網路請求這塊的演變如下:HttpURLConnection,HTTPClient->Volley->Okhttp。所以我這邊會把Volley和Okhttp這兩個框架的使用,進階,分裝都會講一遍,也方便初學者或者各位能夠學會使用以及明白相關的原理。

Volley系列教程大綱如下:

  1. Volley完全解析之基礎
  2. Volley完全解析之進階
  3. Volley完全解析之原始碼分析

今天我們首先來進入Volley

使用基礎階段,會涉及到字串,JSON,圖片等等網路資料請求相關方法的使用。

().Volley基本介紹:   

       2.1.Volley簡介:

         2013Google  I/O大會的時候GoogleAndroid開發團隊推出了一個新網路資料請求框架Volley網路通訊庫,它能夠使得通訊速度更加快,更加簡單以及更健壯。看一下官網的釋出圖片:


發射火弓箭的圖有點類似流星,從這幅圖我們可以看出來Volley比較適合資料量不大但是通訊頻繁的場景。它當初的設計目標就是非常適合去進行資料量不大,但是網路通訊比較頻繁的操作。但是如果資料量很大的網路例如:檔案下載這類的,Volley框架的效率就會比較差了。

        2.2.Volley功能特點:

  1. 提供字串,文字,JSON圖片等資料的非同步下載,同時提供回撥介面
  2. Request請求的優先順序以及排序
  3. 網路請求,圖片等相關快取功能
  4. 網路請求cancel機制
  5. 和原生元件生命週期聯動機制(例如: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物件傳入四個引數:

  1. 請求方法GET/POST/或者其他
  2. 請求伺服器的目標地址
  3. 伺服器資料成功響應回撥
  4. 伺服器資料失敗響應回撥

第三步,就是StringRequest請求物件加入請求佇列中(RequestQueue)

   requestQueue.add(jsonObjectRequest);

以上就完成了StringRequest的請求操作,執行效果如下圖:


上面我們就是完成了StringRequest的請求一種例項,不過上面只是簡單的Get請求,Volley框架也還是支援Post請求,但是比較遺憾的是Volley框架沒有直接提供設定Post請求引數的方法,但是我們實現getParams()方法來新增引數,更加讓我們開發使用起來簡單的方法就是修改Volley框架原始碼,後面使用進階中我們會將到原始碼相關修改。現在我們繼續往下看。

         3.2.JsonObjectRequestJsonArrayRequest使用

           JsonObjectRequestJsonArrayRequest都是整合自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對於圖片載入也給我們提供相應的工具類以及相關方法,主要是以下三種:

  1. ImageRequest
  2. ImageLoder
  3. 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功能強大了一點。使用步驟如下:

  1. 建立RequestQueue請求佇列物件
  2. 建立ImageLoader圖片載入器物件
  3. 獲取ImageListener圖片監聽器
  4. 帶哦用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的功能進行了擴充套件,加入了圖片下載的功能,具體使用方法如下:

  1. 建立RequestQueue物件
  2. 建立Imageloader物件
  3. 佈局檔案使用NetworkImageView自定義控制元件
  4. 使用獲取控制元件呼叫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