*****
**Volley網絡框架**
[TOC=6]
1、Volley?是什么?
2、Volley?如何接入,源代碼怎么獲取??
一、Volley是什么?
Volley是HTTP庫,使得Android應用的網絡操作更容易,尤其重要的是,相比較于普通Android?網絡Api速度更快、也更優雅。
二、Volley具有如下優點:
網絡請求的自動調度:擁有調度線程池
多個并發的網絡連接:擁有請求緩存池
緩存設計遵循?Cache?Coherence
支持請求優先級管理。
取消請求API。取消單個請求,也支持按照Tag來配置請求取消的區域或范圍。
面向接口編程:框架靈活、易于定制,例如,重試機制
強序關系使得很容易的通過異步方式從網絡正確的得到數據,填充到UI界面上。
調試和跟蹤工具:VolleyLog、VolleyLog#VolleyLog等
.使用Volley
1.Volley的網絡請求隊列建立與取消隊列請求
使用Volley需要建立一個全局的請求隊列,這樣我們就可以將一個請求加入到這個全局隊列中,并可以管理整個APP的所有請求,包括取消一個或所有的請求。
2.Volley的Get和Post請求方式的使用
Volley的Get和Post請求方式其實是對Android原生Get和Post請求方式進行了二次封裝,對效率等進行優化。在使用Get和Post請求方式之前,我們要確定所請求的數據返回什么對象,Volley自帶了三種返回類型:
StringRequest:主要使用在對請求數據的返回類型不確定的情況下;
ImageRequest:主要使用在請求圖片;
JsonRequest:主要請求JSON數據;
* JsonObjectRequest:請求Json對象
* JsonArrayRequest:請求Json數組
3.Volley與Activity生命周期的聯動
簡單來說就是Volley中的請求是與Activity的生命周期進行關聯。這樣可以在Android銷毀時關閉Volley的請求,防止請求在后臺運行造成內存溢出等情況發生。與Activity生命周期進行聯動時需要設置Tag標簽,因為取消請求需要在請求隊列中通過Tag標簽進行查找,在Activity的onStop中執行取消請求的操作。
下面通過代碼進行實例的演示。
使用
第一步添加網絡權限
???添加依賴
~~~
implementation?'com.mcxiaoke.volley:library:1.0.19'
~~~
第二步?初始化volley
~~~
第一種在Application中寫RequestQueue對象。
存在的問題,請求隊列在Application類中,請求對象封裝在工具類中,代碼分別在兩部分中。
MyApplication.java
publicclass?MyApplication?extends?Application{ ????
privatestatic?RequestQueue?queues?; ??
@Override ????
publicvoid?onCreate()?{ ???????
super.onCreate(); ????????
queues?=?Volley.newRequestQueue(getApplicationContext()); ???
? } ????
public static?RequestQueue?getHttpQueues()?{
????????return?queues; ??
? }
}
~~~
~~~
第二種:都放在工具類中
public class VolleyHttpImpl implements HttpUtil {
private static VolleyHttpImpl instance = null;
private RequestQueue queue;
/**
* 構造方法
* @param context
*/
private VolleyHttpImpl(Context context) {
if (context == null) {
throw new IllegalArgumentException("初始化的時候,content不能是null");
}
queue = Volley.newRequestQueue(context);
}
/**
* 創建VolleyHttpImpl對象
* @param context
* @return
*/
public static VolleyHttpImpl create(Context context) {
if (instance == null) {
synchronized (VolleyHttpImpl.class) {
instance = new VolleyHttpImpl(context);
}
}
return instance;
}
/**
* 獲取VolleyHttpImpl對象
* @return
*/
public static VolleyHttpImpl getInstance() {
return create(null);
}
/**
* 根據tag關閉請求
*/
public void cancelAll(String tag) {
queue.cancelAll(tag);
}
}
~~~
?第三步通過請求方式寫網絡請求方法
Get方式請求數據返回StringRequest對象
~~~
private?void?volleyGet()?{
????????String?url?=?"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
????????StringRequest?request?=?new?StringRequest(Method.GET,?url,
????????????????new?Listener<String>()?{
????????????????????@Override
????????????????????public?void?onResponse(String?s)?{//s為請求返回的字符串數據
????????????????????????Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
????????????????????}
????????????????},
????????????????new?ErrorListener()?{
????????????????????@Override
????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{
????????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
????????????????????}
????????????????});
????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找
????????request.setTag("testGet");
????????//將請求加入全局隊列中
????????MyApplication.getHttpQueues().add(request);
????}
~~~
Get方式請求數據返回JsonObjectRequest對象
~~~
/**
?*??new?JsonObjectRequest(int?method,String?url,JsonObject?jsonObject,Listener?listener,ErrorListener?errorListener)
?*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST
?*??url:請求地址
?*??JsonObject:Json格式的請求參數。如果使用的是Get請求方式,請求參數已經包含在url中,所以可以將此參數置為null
?*??listener:請求成功后的回調
?*??errorListener:請求失敗的回調
?*/
private?void?volleyGet()?{
????String?url?=?"http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
????JsonObjectRequest?request?=?new?JsonObjectRequest(Method.GET,?url,?null,
????????????new?Listener<JSONObject>()?{
????????????????@Override
????????????????public?void?onResponse(JSONObject?jsonObject)?{//jsonObject為請求返回的Json格式數據
????????????????????Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
????????????????}
????????????},
????????????new?ErrorListener()?{
????????????????@Override
????????????????public?void?onErrorResponse(VolleyError?volleyError)?{
????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
????????????????}
????????????});
????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找
????request.setTag("testGet");
????//將請求加入全局隊列中
????MyApplication.getHttpQueues().add(request);
~~~
Post方式請求數據返回StringRequest對象
~~~
/**
?????*?使用Post方式返回String類型的請求結果數據
?????*?
?????*??new?StringRequest(int?method,String?url,Listener?listener,ErrorListener?errorListener)
?????*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST
?????*??url:請求地址
?????*??listener:請求成功后的回調
?????*??errorListener:請求失敗的回調
?????*/
????private?void?volleyPost()?{
????????String?url?=?"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
????????StringRequest?request?=?new?StringRequest(Method.POST,?url,
????????????????new?Listener<String>()?{
????????????????????@Override
????????????????????public?void?onResponse(String?s)?{//s為請求返回的字符串數據
????????????????????????Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
????????????????????}
????????????????},
????????????????new?ErrorListener()?{
????????????????????@Override
????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{
????????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
????????????????????}
????????????????}){
????????????????????@Override
????????????????????protected?Map<String,?String>?getParams()?throws?AuthFailureError?{
????????????????????????Map<String,String>?map?=?new?HashMap<>();
????????????????????????//將請求參數名與參數值放入map中
????????????????????????map.put("tel","15850781443");
????????????????????????return?map;
????????????????????}
????????????????}
????????????????;
????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找
????????request.setTag("testPost");
????????//將請求加入全局隊列中
????????MyApplication.getHttpQueues().add(request);
????}
~~~
Post方式請求數據返回JsonObject對象
~~~
/**
?*??使用Post方式返回JsonObject類型的請求結果數據
?*
?*??new?JsonObjectRequest(int?method,String?url,JsonObject?jsonObject,Listener?listener,ErrorListener?errorListener)
?*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST
?*??url:請求地址
?*??JsonObject:Json格式的請求參數。如果使用的是Get請求方式,請求參數已經包含在url中,所以可以將此參數置為null
?*??listener:請求成功后的回調
?*??errorListener:請求失敗的回調
?*/
private?void?volleyPost()?{
????String?url?=?"http://www.kuaidi100.com/query";
????Map<String,String>?map?=?new?HashMap<>();
????map.put("type","yuantong");
????map.put("postid","229728279823");
????//將map轉化為JSONObject對象
????JSONObject?jsonObject?=?new?JSONObject(map);
????JsonObjectRequest?request?=?new?JsonObjectRequest(Method.POST,?url,?jsonObject,
????????????new?Listener<JSONObject>()?{
????????????????@Override
????????????????public?void?onResponse(JSONObject?jsonObject)?{//jsonObject為請求返回的Json格式數據
????????????????????Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
????????????????}
????????????},
????????????new?ErrorListener()?{
????????????????@Override
????????????????public?void?onErrorResponse(VolleyError?volleyError)?{
????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
????????????????}
????????????});
????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找
????request.setTag("testPost");
????//將請求加入全局隊列中
????MyApplication.getHttpQueues().add(request);
}
~~~
Activity生命周期聯動
~~~
@Override
protected?void?onStop()?{
????super.onStop();
????//通過Tag標簽取消請求隊列中對應的全部請求
????MyApplication.getHttpQueues().cancelAll("abcGet");
}
~~~
使用ImageRequest加載網絡圖片
~~~
/**
?????*??通過Volley加載網絡圖片
?????*
?????*??new?ImageRequest(String?url,Listener?listener,int?maxWidth,int?maxHeight,Config?decodeConfig,ErrorListener?errorListener)
?????*??url:請求地址
?????*??listener:請求成功后的回調
?????*??maxWidth、maxHeight:設置圖片的最大寬高,如果均設為0則表示按原尺寸顯示
?????*??decodeConfig:圖片像素的儲存方式。Config.RGB_565表示每個像素占2個字節,Config.ARGB_8888表示每個像素占4個字節等。
?????*??errorListener:請求失敗的回調
?????*/
????private?void?loadImageByVolley()?{
????????String?url?=?"http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
????????ImageRequest?request?=?new?ImageRequest(
????????????????????????????url,
????????????????????????????new?Listener<Bitmap>()?{
????????????????????????????????@Override
????????????????????????????????public?void?onResponse(Bitmap?bitmap)?{
????????????????????????????????????image.setImageBitmap(bitmap);
????????????????????????????????}
????????????????????????????},
????????????????????????????0,?0,?Config.RGB_565,
????????????????????????????new?ErrorListener()?{
????????????????????????????????@Override
????????????????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{
????????????????????????????????????image.setImageResource(R.mipmap.ic_launcher);
????????????????????????????????}
????????????????????????????});
????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找
????????request.setTag("loadImage");
????????//通過Tag標簽取消請求隊列中對應的全部請求
????????MyApplication.getHttpQueues().add(request);
????}
~~~
ImageLoader加載及緩存網絡圖片
~~~
/**
?????*??通過ImageLoader加載及緩存網絡圖片
*
?????*??new?ImageLoader(RequestQueue?queue,ImageCache?imageCache)
?????*??queue:請求隊列
?????*??imageCache:一個用于圖片緩存的接口,一般需要傳入它的實現類
?????*
?????*??getImageListener(ImageView?view,?int?defaultImageResId,?int?errorImageResId)
?????*??view:ImageView對象
?????*??defaultImageResId:默認的圖片的資源Id
?????*??errorImageResId:網絡圖片加載失敗時顯示的圖片的資源Id
?????*/
????private?void?loadImageWithCache()?{
????????String?url?=?"http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
????????ImageLoader?loader?=?new?ImageLoader(MyApplication.getHttpQueues(),?new?BitmapCache());
????????ImageListener?listener?=?loader.getImageListener(image,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
????????//加載及緩存網絡圖片
????????loader.get(url,listener);
????}
~~~
BitmapCache?設置圖片緩存
~~~
public?class?BitmapCache?implements?ImageLoader.ImageCache{
????//LruCache是基于內存的緩存類
????private?LruCache<String,Bitmap>?lruCache;
????//LruCache的最大緩存大小
????private?int?max?=?10?*?1024?*?1024;
????public?BitmapCache()?{
????????lruCache?=?new?LruCache<String,?Bitmap>(max){
????????????@Override
????????????//緩存圖片的大小
????????????protected?int?sizeOf(String?key,?Bitmap?value)?{
????????????????return?value.getRowBytes()?*?value.getHeight();
????????????}
????????};
????}
????@Override
????public?Bitmap?getBitmap(String?s)?{
????????return?lruCache.get(s);
????}
????@Override
????public?void?putBitmap(String?s,?Bitmap?bitmap)?{
????????lruCache.put(s,bitmap);
????}
}
~~~
- 班規
- 第一單元 Git
- 1.1 Git簡介
- 1.2 Git安裝
- 1.3 版本控制
- 1.4 遠程倉庫
- 1.5 分支管理
- 1.6 Git命令總結
- 1.7 在Android Studio中使用Git
- 第一單元 作業
- 第二單元 項目立項
- 2.1 需求文檔
- 2.2 原型圖
- 2.3 接口文檔
- 2.4 項目實現
- 2.5 制定開發計劃
- 第二單元 作業
- 第三單元 MVP搭建項目框架
- 3.1 代碼架構模式
- 3.2 普通方式寫代碼
- 3.3 使用MVC重構代碼
- 3.4 使用MVP重構代碼
- 3.5 使用接口提高代碼通用性
- 3.6 內存泄漏
- 3.7 使用契約統一管理接口
- 第三單元 作業
- 第四單元 MVP架構優化
- 4.1 MVP基類封裝與泛型應用
- 4.3 BaseActivity的封裝
- 第五單元 Volley網絡框架
- 5.1 Volley網絡框架
- 第六單元 Glide實現圖片異步加載
- 6.1 開始使用
- 6.2 占位符
- 6.3 Glide緩存
- 6.4 GlideGifVideo與色彩模式
- 第七單元 傳統屏幕適配
- 7.1 相對布局
- 7.1 權重
- 7.3 .9Patch
- 7.4 dimens適配
- 7.5 國際化
- 7.6 shape實現自定義樣式
- 7.7 自定義樣式
- 7.8 沉浸式狀態欄
- 第八單元 RecyclerView
- 8.1 RecycleView
- 第九單元 自定義View
- 第十單元 自定義View實戰
- 第十一單元 自定義View進階
- 第二十單元 屬性動畫
- 第十三單元 異常捕獲機制
- 第十四單元 原生登錄、注冊模塊
- 第十五單元 第三方登錄、分享、統計
- 第十六單元 HTML5新特性
- 第十七單元 CSS3新特性
- 第十八單元 WebView與JS交互
- 第一周周考
- 第二周周考
- 第三周周考
- 月考