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