开源框架Volley的使用《一》
轉載本專欄每一篇博客請注明轉載出處地址,尊重原創。此博客轉載鏈接地址:小楊的博客 http://blog.csdn.net/qq_32059827/article/details/52785378
本篇對一個開源框架Volley的使用做一個匯總。概述如下:
Volley
- 回憶xutils:快速開發型框架,DbUtils(orm),ViewUtils(ioc),HttpUtils,BitmapUtils
- 其他的快速開發型框架:andBase,thinkandroid,loonandroid,dhroid
- orm:對象關系型映射
- db:create table ttable(id integer primary key autoincret...);
- insert-->save(obj)
- ioc:控制反轉
- Obj obj = new Obj();
- 對象的實例化,不用new關鍵字就可以了吧.
- 為什么要講volley?
- 因為它是google出的,google 在2013 i/o大會上提出來的.
- 而且在幾個項目里面已經看到了它的身影
- google公司為什么會去搞一個volley框架?
- 1. 用戶開啟一個activity,然后加載網絡,這個時候.如果用戶點擊了finish按鈕.activity被銷毀了-->網絡請求和activity的生命周期是應該聯動起來的.
- 2. listview加載圖片的情況比較多.如果用戶快速的去滑動listview-->getView->快速的加載圖片,用戶停止操作的時候.其實真正現實的圖片最多就幾張--->圖片應該緩存起來(內存 +本地 )
- 3. 如果用戶打開了一個activity,用戶旋轉了一下屏幕.activity會旋轉-->生命周期重走了-->網絡請求緩存
- 4. 之前我們的網絡請求,httpurlconnection,httpclient,asynctask(api)-->android sdk-->封裝性不夠好.1000個開發者就有1000種使用方式-->不夠統一
- 5. 理念很容易理解,是開源的.
- volley是啥?
- 是一種通信框架,和xutils中的HttpUtils,BitmapUtils
Volley兩個核心類
- RequestQueue?用來執行請求的請求隊列
- Request?用來構造一個請求對象
- Request對象主要有以下幾種類型:?
- StringRequest?響應的主體為字符串
- JsonArrayRequest?發送和接收JSON數組
- JsonObjectRequest?發送和接收JSON對象
- ImageRequest?發送和接收Image
- Request:一個請求
- StringRequest:請求的時候直接回來一個String
- JsonObjectRequest:請求的時候直接回來一個JsonObject
- JsonArrayRequest:請求的時候直接回來一個JsonArray
- ImageRequest:請求的時候直接回來一個Bitmap
- 自定義請求:一會我們會結合gson
- ImageLoader:圖片的加載器
- NetWorkImageView:繼承了imageView,對ImageView進行了拓展
- RequestQueue:請求隊列
Volley到底有哪些特點呢?
接下來就一一對其使用方式做一個匯總。
1、StringRequest的使用,代碼如下:
package com.example.volleydemo;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initStringRequest();}/*** StringRequest使用*/private void initStringRequest() {Button btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1、創建StringRequest對象String url = "http://www.baidu.com";StringRequest stringRequest = new StringRequest(url , new Listener<String>() {@Overridepublic void onResponse(String response) {// 請求成功回調System.out.println("success---->>"+response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// 失敗回調System.out.println("error---->>"+error);}});//2、創建requestQueueRequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);//3、發起網絡請求----》把reuest防盜requestqueue中requestQueue.add(stringRequest);}});} }其實和httputils差不多。
2、JsonObjectRwquest的使用
請求服務器。直接返回一個數據的jsonObject對象
JsonObject取值
- String origin = response.getString("origin");// 方式一
- 這個如果沒有對應的key會拋異常.需要異常處理
- String origin = response.optString("origin");// 方式二
- 這個如果沒有對應的key不會拋異常.會返回一個默認值
- optString:默認值""
- optInt:默認值 0
- 比如有的實體bean屬性很多.我們不喜歡去建議對應的XXX.class的時候.可以使用JsonObject里面的這個方法
3、JsonArrayRequest的使用
請求服務器。直接返回一個數據的jsonArrayt對象。和2非常接近。只不過是把Object換成Array。稍作修改罷了。
4、ImageRequest的使用
/*** ImageRequest的使用*/private void initImageRequest() {findViewById(R.id.btn3).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String url = "http://192.168.1.100:8080/meinv.jpg";ImageRequest imageRequest = new ImageRequest(url , new Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {iv.setImageBitmap(response);}}, 0, 0, Bitmap.Config.ARGB_4444, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});//2、創建requestQueueRequestQueue queue = Volley.newRequestQueue(MainActivity.this);//3、發起網絡請求----》把reuest放到requestqueue中queue.add(imageRequest);}});}到這里,可能就要詳細說明上邊代碼意義了。加載圖片,不想前面三種簡單,這里還是有許多學問的。那么,就從源碼的角度,從0開始來分析這里的原理。
4.1 使用步驟
ImageRequest仍舊是一個request對象,所以使用方式和StringRequest、JsonObjectRequest、JsonArrayRequest十分相似。
步驟:
第一步、第三步我們在上篇文章中已經做好了,如果不清楚的話可以去上一篇文章查看。
?
4.2 分析構造函數
源碼中的構造函數是這樣定義的:
public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,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;}默認的請求方式是GET,初始化方法需要傳入:圖片的url,一個響應結果監聽器,圖片的最大寬度,圖片的最大高度,圖片的顏色屬性,出錯響應的監聽器。
說明:圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片像素占據4個字節的大小,而RGB_565則表示每個圖片像素占據2個字節大小
/** Socket timeout in milliseconds for image requests */private static final int IMAGE_TIMEOUT_MS = 1000;/** Default number of retries for image requests */private static final int IMAGE_MAX_RETRIES = 2;/** Default backoff multiplier for image requests */private static final float IMAGE_BACKOFF_MULT = 2f;
- 設定超時時間:1000ms;
- 最大的請求次數:2次;
- 發生沖突時的重傳延遲增加數:2f(這個應該和TCP協議有關,沖突時需要退避一段時間,然后再次請求);
4.3 解釋maxWidth,maxHeight參數
注釋中詳細說明了圖片寬高的意義和作用,為了便于理解我再詳細說一下。
先來完整解釋下注釋的意思:
- 建立一個請求對象,按照最大寬高進行解碼 。
- 如果設定的寬和高都是0,那么下載到的圖片將會按照實際的大小進行解碼,也就是不壓縮。
- 如果寬和高中的一個或兩個值不為0,那么圖片的寬/高(取決于你設定了寬還是高)會壓縮至設定好的值,而另一個寬/高將會按原始比例改變。
- 如果寬和高都不是0,那么得到的圖片將會“按比例”解碼到你設定的寬高,也就是說最終得到的圖片大小不一定是你最初設定的大小。
舉個例子:
我的圖片原本像素是:850x1200.
當maxWidth = 0,maxHeight = 0時,最終得到的bitmap的寬高是850x1200
當maxWidth = 0,maxHeight = 600時,得到的bitmap是425x600.這就說明它會按照一個不為0的邊的值,將圖片進行等比縮放。
當maxWidth = 100,maxHeight = 600時,我們得到的bitmap竟然是100x141,是按照100進行等比縮小后的圖片,而不是100x600.
這是因為源碼中,當寬高分別縮放后,會按照縮放比例大的哪個比例去縮放。就是上邊第三種情況:寬縮小8.5倍,高也按照這個比例去縮放。
總結
以上是生活随笔為你收集整理的开源框架Volley的使用《一》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2023前端基础面试题
- 下一篇: 疫情下的职场生存记:从写简历到面试谈薪的