Android 網絡請求庫:Volley
既然在android2.2之后不建議使用Http Client,那么有沒有一個庫是android2.2及以下版本使用Http Client,而android2.3及以上版本使用HttpUrlConnection的呢,答案是肯定的,就是Volley,它是android開發團隊在2013年Google I/O大會上推出了一個新的網絡通信框架
Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像 AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖片。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目標就是非常適合去進行數據量不大,但通信頻繁的網絡操作,而對于大數據量的網絡操作,比如說下載文件等,Volley的表現就會非常糟糕
特點
- Volley的優勢在于處理小文件的http請求;
- 在Volley中也是可以使用Okhttp作為傳輸層
- Volley在處理高分辨率的圖像壓縮上有很好的支持;
- NetworkImageView在GC的使用模式上更加保守,在請求清理上也更加積極,networkimageview僅僅依賴于強大的內存引用,并當一個新請求是來自ImageView或ImageView離開屏幕時 會清理掉所有的請求數據。
用法
- 創建一個RequestQueue對象。
- 創建一個Request對象。
- 將Request對象添加到RequestQueue里面。
下面一步一步來學習其用法
- GET
private void get(){ RequestQueue queue= Volley.newRequestQueue(getApplicationContext()); String url="http://121.41.119.107/test/index.php"; StringRequest request=new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG",response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(request); }
- POST
通過指定請求方法為Request.Method.POST使其成為post請求,然后重新getParams方法設置請求參數。當發出POST請求的時候,Volley會嘗試調用StringRequest的父類——Request中的getParams()方法來獲取POST參數
private void post() { RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "http://121.41.119.107/test/login.php"; StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("TAG", response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { //重寫getParams方法設置參數 @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("user", "asas"); params.put("pass", "12121"); params.put("time", "1212121"); return params; } }; queue.add(request); }
- 加載圖片
加載圖像的方法和前面類似,只不過不在是StringRequest而是ImageRequest。
private void getImage() { RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "https://www.baidu.com/img/bdlogo.png"; //第三第四個參數分別用于指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大于這里的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。 //第五個參數就是ImageView里中的屬性ScaleType //第六個參數用于指定圖片的顏色屬性 ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { ImageView iv= (ImageView) findViewById(R.id.iv); iv.setImageBitmap(response); } }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(request); }
其實加載圖片的功能還遠遠不止這些,使用ImageLoader可以實現對圖片的緩存,還可以過濾重復鏈接,避免發送重復的請求
ImageLoader的使用方法概括為以下幾步
1. 創建一個RequestQueue對象。
2. 創建一個ImageLoader對象。
3. 獲取一個ImageListener對象。
4. 調用ImageLoader的get()方法加載網絡上的圖片。
//繼承ImageCache,使用LruCache實現緩存 public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = 10 * 1024 * 1024; mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { return mCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { mCache.put(url, bitmap); } } private void getImageByImageLoader() { ImageView iv= (ImageView) findViewById(R.id.iv); RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String url = "https://www.baidu.com/img/bdlogo.png"; ImageLoader loader=new ImageLoader(queue,new BitmapCache() ); // 第一個參數指定用于顯示圖片的ImageView控件 // 第二個參數指定加載圖片的過程中顯示的圖片 // 第三個參數指定加載圖片失敗的情況下顯示的圖片 ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher); // 調用ImageLoader的get()方法來加載圖片 // 第一個參數就是圖片的URL地址 // 第二個參數則是剛剛獲取到的ImageListener對象 // 如果想對圖片的大小進行限制,也可以使用get()方法的重載,指定圖片允許的最大寬度和高度,即通過第三第四個參數指定 loader.get(url,listener); }
最后,Volley提供了一種自定義ImageView來加載圖片,其使用方法可概括為
1. 創建一個RequestQueue對象。
2. 創建一個ImageLoader對象。
3. 在布局文件中添加一個NetworkImageView控件。
4. 在代碼中獲取該控件的實例。
5. 設置要加載的圖片地址。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!