Android框架之Volley與Glide
PS:在看到這個題目的同時,你們估計會想,Volley與Glide怎麼拿來一塊說呢,他們雖然不是一個框架,但有著相同功能,那就是圖片處理方面。首先我們先來看一下什麼volley,又什麼是glide。
Volley是Google官方出的一套小而巧的非同步請求庫,該框架封裝的擴充套件性很強,支援OkHttp,Volley裡面也封裝了ImageLoader,自身作為圖片載入框架,不過這塊功能沒有一些專門的圖片載入框架強大,對於簡單的需求可以使用,對於稍複雜點的需求還是需要用到專門的圖片載入框架。Volley也有缺陷,比如不支援post大資料,所以不適合上傳檔案。不過Volley設計的初衷本身也就是為頻繁的、資料量小的網路請求而生!
個人建議:
如果請求的資料比較小的話,建議用volley,因為它程式碼量小,效果高,但是如果是下載大型檔案(影片),那就不要用它了。
Glide是 Google推薦的圖片載入庫,它可以支援來自ur,檔案,支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等.
他們竟然都是Google的,那為什麼出了volley還要出Glide呢,其實他們只是有交集而已,並不是二選一,而是相輔相成。我們想要了解他們,就要先學會怎麼用他們,下面寫說一下Volley。下面分為多個小部分來講。
首先 AndroidStudio中引入Volley三種方法
引入volley.jar檔案
-
新增volley到gradle依賴
1 compile
'com.mcxiaoke.volley:library:1.0.19'
透過git下載volley,新增為專案module
1:StringRequest
先熱熱身,傳入一個百度連結,返回一些資料。
1.1簡單請求一個網路地址並返回資料,建立佇列
1 | RequestQueue queue=Volley.newRequestQueue(context); |
1.2在需要的地方建立StringRequest(引數..)
GET/POST
url地址
響應監聽
錯誤監聽
String url = "" ; StringRequest request = new StringRequest(Request.Method.GET,url, new Response.Listener @Override public void onResponse(String response) {result = SecuritUtil.aesBase64Decode(response); }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } } });
|
1.3最後處理要加入到佇列中
1 | queue.add(request); |
我去,這就可以了,我自己都緊張了,記得以前用httpconnect的時候,寫的真的是多,還要配置很多的東西,就連retrofit都要寫註解什麼的。retrofit我之前有些文章,不怎麼會用的同志可以去看看。好了,資料是出來了,我沒有截圖,大家瞭解,這什麼都不傳是簡單,但如果想傳值呢,那就POST方法唄。
2:POST帶引數請求
在建立StringRequest方法前,我們先看一下原始碼方法,4個引數。
/** * 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, Listenerlistener, ErrorListener errorListener) { super(method, url, errorListener); mListener = listener; }
2.1:還是一樣的寫建立一個StringRequest,看註釋
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { //成功後 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //失敗後 } }) {//傳值方法書寫位置 @Override protected Map getParams() throws AuthFailureError { HashMap map = new HashMap(); map.put("name", "liu"); map.put("id", "123456789"); return map; } }; //這裡需要注意的是getParams()方法是寫在StringRequest(內)的,括號標紅。
2.2最後要把該物件放在queue中
queue.add(request);
這就完事了,傳值直接寫上就OK了,都是鍵值對的形式。到這估計有人覺得這是傳普通值,如果我傳JSON呢,有有有,下面就是。
3:JSON格式傳參和接受資料
這個JSON傳值話也是分GET和PSOT方法,GET一般都不傳值,直接填""。POST則是用專用類JsonObjectRequest,如果你覺得不過癮還可以用
JsonArrayRequest。老規矩還是先看一下原始碼
/** * Creates a new request. * @param method the HTTP method to use * @param url URL to fetch the JSON from * @param requestBody A {@link String} to post with the request. Null is allowed and * indicates no parameters will be posted along with request. * @param listener Listener to receive the JSON response * @param errorListener Error listener, or null to ignore errors. */ public JsonObjectRequest(int method, String url, String requestBody, Listenerlistener, ErrorListener errorListener) { super(method, url, requestBody, listener, errorListener); }
3.1:請求方式GET,無引數傳入
JsonObjectRequest json=new JsonObjectRequest(Request.Method.GET, url, "", new Response.Listener() { @Override public void onResponse(JSONObject response) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } });
3.2:請求方式POST
JSONObject jsonO=new JSONObject(); try { jsonO.put("name",""); jsonO.put("ID",""); } catch (JSONException e) { e.printStackTrace(); }//建立JSONObject物件 JsonObjectRequest json=new JsonObjectRequest(Request.Method.POST, url, jsonO, new Response.Listener() { @Override public void onResponse(JSONObject response) { //ok } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //error } });
3.3:最後要把該物件放在queue中
queue.add(request);
到這裡volley怎麼用來訪問網路資料就完事了,到現在還沒有說他的圖片處理,不過這個框架真心好用,所以就寫的多了點。下面我們們來看一下他的圖片處理
4:ImageRequest, 圖片載入
原始碼:圖片URL,響應的回撥介面,最大圖片寬度,最大圖片高度,圖片配置RGB模式,錯誤的回撥介面
最大圖片寬度(高度)如果不寫可以寫0,
/** * Creates a new image request, decoding to a maximum specified width and * height. If both width and height are zero, the image will be decoded to * its natural size. If one of the two is nonzero, that dimension will be * clamped and the other one will be set to preserve the image's aspect * ratio. If both width and height are nonzero, the image will be decoded to * be fit in the rectangle of dimensions width x height while keeping its * aspect ratio. * * @param url URL of the image * @param listener Listener to receive the decoded bitmap * @param maxWidth Maximum width to decode this bitmap to, or zero for none * @param maxHeight Maximum height to decode this bitmap to, or zero for * none * @param scaleType The ImageViews ScaleType used to calculate the needed image size. * @param decodeConfig Format to decode the bitmap to * @param errorListener Error listener, or null to ignore errors */ public ImageRequest(String url, Response.Listenerlistener, int maxWidth, int maxHeight, ScaleType scaleType, Config decodeConfig, Response.ErrorListener errorListener) { super(Method.GET, url, errorListener); setRetryPolicy( new DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT)); mListener = listener; mDecodeConfig = decodeConfig; mMaxWidth = maxWidth; mMaxHeight = maxHeight; mScaleType = scaleType; }
用法:每個引數是什麼我都在上面寫好,第幾個引數是幹什麼的,還有原始碼供大家參考。url為圖片地址
ImageRequest request =new ImageRequest(url,Response.Listener(){ @Override public void onResponse(Bitmap s) { Log.i("aa", "post請求成功" + s); } } ,0,0,Bitmap.config.RGB_565,new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) {
Log.i("aa", "post請求失敗" + s); });
5:ImageLoader 圖片快取機制(推薦使用)
在普通版中自身是呼叫自己的快取類,這個是我們不能控制的,如果想要控制的就要自己寫類來實現ImageLoader.ImageCache,這就相當於我們的自定義View,或者自定義介面卡,我們可以更好的去控制我們想要的結果,比如說,我們要它最大快取量是10M,超過這個值會發出警報等。
下面來說簡單用法
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String url) { //具體操作,主要針對對快取資料大小、如何快取。 return null; } @Override public void putBitmap(String url, Bitmap bitmap) { } });//imgShow是imageview控制元件。後面引數分類是失敗和過程時出現的圖片 ImageLoader.ImageListener listener = ImageLoader.getImageListener(imgShow, R.mipmap.ic_launcher, R.drawable.btn_add_true); imageLoader.get(url, listener, 200, 200);
上面這個就可以對圖片進行處理,不過還有一個就是定義介面,裡面有兩個方法,一個放一個是取,重點是標紅
public class ImageCache implements ImageLoader.ImageCache{//LruCache 是專門用於快取的類,String可以作為快取入後的名稱,Bitmap是點陣圖。 public LruCachelruCache; public int maxCache=10 * 1024 *1024;//最大快取大小 10M public ImageCache (){ lruCache=new LruCache(maxCache);//例項化建立 } @Override public Bitmap getBitmap(String url) {//得到點陣圖 return lruCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) {//存入點陣圖 lruCache.put(url,bitmap); } }
6:NetWorkImageView自動適配圖片(控制元件)
netimg = (NetworkImageView) findViewById(R.id.id_net_img); netimg.setErrorImageResId(R.mipmap.ic_launcher);//錯誤後netimg.setDefaultImageResId(R.drawable.btn_add_true);//載入中預設//這裡new ImageCache()是上面自己寫的類netimg.setImageUrl(url,new ImageLoader(queue,new ImageCache()));
到這裡volley基本用法就已經夠用了,原本想寫點Glide的用法呢,還有對比,這一篇寫的就不少了。大家可以消化一下,下一篇我寫Glide的簡單用法,然後是Volley對比Glide。
總結:
Volley是輕量級的網路請求框架,如果請求的資料比較小的話,建議用volley,因為它程式碼量小,效果高,但是如果是下載大型檔案(影片),那就不要用它了。
但是如果有一個listview了,GridView了等載入圖片的話,可以用Volley,尤其是最後一個NetWorkImageView,可以自動適配圖片大小,然後統一作出判斷到底該多大才能更好的呈現給使用者。每一個框架都是一些人的心血,肯定是優點爆棚的,對於程式設計師來講一個好的工具對以後的開發是多麼的重要,一個功能省去了一些程式碼,功能多了程式碼就非誠客觀了,而且簡介明瞭規範。謝謝大家的支援。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2801651/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android圖片快取框架GlideAndroid快取框架IDE
- Android Volley 基本使用Android
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- Android示例應用:開源框架Glide的使用Android框架IDE
- Volley 網路請求框架介紹與使用說明框架
- Android每週一輪子:VolleyAndroid
- Android studio glide包重複問題AndroidIDE
- Volley 原始碼解析之快取機制原始碼快取
- Volley 原始碼解析之圖片請求原始碼
- Volley 原始碼解析之網路請求原始碼
- Android之Mina框架學習Android框架
- Android 圖片載入庫Glide知其然知其所以然之載入AndroidIDE
- Android精通之OrmLite資料庫框架,Picasso框架,Okio框架,OKHttp框架AndroidORM資料庫框架HTTP
- Android系統介紹與框架Android框架
- Flutter載入圖片與GlideFlutterIDE
- Volley 原始碼探索原始碼
- Android基礎之Java集合框架CollectionAndroidJava框架
- Android之Window與WindowManagerAndroid
- Android專案實戰(五十七):Glide 高斯模糊效果AndroidIDE
- Android9.0使用Glide載入圖片問題AndroidIDE
- Android 開發:glide圓角,圓形,效率問題AndroidIDE
- Glide 快取與解碼複用IDE快取
- Volley的原理解析
- Android Hook框架Xposed原理與原始碼分析AndroidHook框架原始碼
- Android車載多媒體與MediaSession框架AndroidSession框架
- Android之五大應用開發框架Android框架
- Architecture(2)Volley原始碼分析原始碼
- Android 媒體播放框架MediaSession分析與實踐Android框架Session
- Android程式框架:執行緒與執行緒池Android框架執行緒
- 【Android面試技巧】當面試官問你glide的時候,是想問什麼?glide生命週期如何實現?Android面試IDE
- Flutter與android之間的通訊FlutterAndroid
- Glide 系列-3:Glide 快取的實現原理(4.8.0)IDE快取
- Android圖片載入庫Glide 知其然知其所以然 開篇AndroidIDE
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- Glide 系列-1:預熱、Glide 的常用配置方式及其原理IDE
- Glide 知識梳理(6) – Glide 原始碼解析之流程剖析IDE原始碼
- Android Native 開發之 NewString 與 NewStringUtf 解析Android