Android Volley框架使用詳解
Volley瞭解
Volley的中文翻譯為“齊射、併發”,是在2013年的Google大會上釋出的一款Android平臺網路通訊庫,具有網路請求的處理、小圖片的非同步載入和快取等功能,能夠幫助 Android APP 更方便地執行網路操作,而且更快速高效。
在Google IO的演講上,其配圖是一幅發射火弓箭的圖,有點類似流星。這表示,Volley特別適合資料量不大但是通訊頻繁的場景。見下圖:
而對於大資料量的網路操作,比如說下載檔案等,Volley的表現就會非常糟糕。
下圖所示的這些應用都是屬於資料量不大,但網路通訊頻繁的,因此非常適合使用Volley。
Volley 的優點:
- 自動排程網路請求;
- 高併發網路連線;
- 通過標準的 HTTP cache coherence(快取記憶體一致性)快取磁碟和內 存透明的響應;
- 支援指定請求的優先順序;
- 網路請求cancel機制。我們可以取消單個請求,或者指定取消請求佇列中的一個區域;
- 框架容易被定製,例如,定製重試或者回退功能;
- 包含了除錯與追蹤工具;
下載&配置
Eclipse的使用者:
下載到github上或者maven上下載Volley的jar包volley.jar,放在libs資料夾內;Android Studio的使用者:
在build.gradle中加入:
compile 'com .mcxiaoke.volley:library:1.0.19'
Volley的使用
1、StringRequest(字串請求)
GET請求
//1.創建出請求佇列
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
//2.創建出來字串請求物件: StringRequest
/**
* 1param: 請求方式 get/post
* 2p:請求的url地址
* 3p:請求成功後的介面回撥
* 4p:請求失敗後回撥
* 5p:成功的監聽,通過引數返回請求到的資料
* 6p:失敗的監聽,失敗在這裡處理
*/
StringRequest mStrReq = new StringRequest(Request.Method.GET, "https://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 這個方法執行在主執行緒中,可以直接更新ui
// 通過引數返回請求到的資料
mTv_result.setText(response);
Toast.makeText(StrReqActivity.this, "下載成功", Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 這個方法執行在主執行緒中,可以直接更新ui
// 失敗在這裡處理
Toast.makeText(StrReqActivity.this, "下載失敗", Toast.LENGTH_SHORT).show();
}
});
//設定Tag值
mStrReq.setTag("100");
btn_req.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//3.把請求物件新增到請求佇列中,會自動發出請求
mRequestQueue.add(mStrReq);
}
});
POST請求
String url_post = "http://zhushou.72g.com/app/gift/gift_list/";
StringRequest mStrReq = new StringRequest(Request.Method.POST, url_post
, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//
}
}) {//這裡需要重寫getParams方法
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//把post的請求引數,放入請求體中
//請求條件:platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
Map<String, String> params = new HashMap<>();
params.put("platform", "2");
params.put("gifttype", "1");
params.put("compare", "60841c5b7c69a1bbb3f06536ed685a48");
return params;
}
};
//點選加入到請求佇列中
btn_req_json.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mRequestQueue.add(mStrReq);
}
});
附:
Volley支援手動/自動取消請求,可以在Activity銷燬的時候手動取消請求:
@Override
protected void onDestroy() {
super.onDestroy();
//取消請求:有三種方式
//1. 取消對應的請求物件
mStrReq.cancel();
//2. 取消請求佇列中對應tag的請求
//mRequestQueue.cancelAll("100");
//3. 取消請求佇列中所有的請求
//mRequestQueue.cancelAll(this);
}
2、JsonObjectRequest與JsonArrayRequest(json資料請求)
JsonObjectRequest請求(一樣要加到請求佇列中才會自動載入)返回的是一個JSONObject物件,建立方法如下:
JsonObjectRequest jsonObjectRequest =new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
3、ImageRequest圖片請求
//1.首先有請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
//2.請求物件
//1) 圖片下載的url
//2) 下載成功後,返回一個bitmap物件
//3)4) 最大寬度和最大高度,如果超過最大寬度和高度,會進行壓縮到你設定的寬度和高度,0不限制
//5) 圖片載入的形式
//6)圖片顯示的質量:RGB_565: 每個畫素2位元組 ARGB_8888:每個畫素佔4個位元組
//7)下載圖片失敗後,在這裡邊處理
ImageRequest imgRequest = new ImageRequest(url_img, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//顯示成功的圖片
iv_show.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//設定失敗的圖片
iv_show.setBackgroundResource(R.mipmap.ic_launcher);
}
});
4、ImageLoader圖片載入
//1、首先有請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
//2、創建出ImageLoader物件
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//3、呼叫ImageLoader的get方法設定圖片
//getImageListener中的三個引數:1,下載好的圖片設定給哪個控制元件 2,預設圖片 3.下載失敗的圖片
loader.get(url_img, ImageLoader.getImageListener(iv_show, R.mipmap.ic_default, R.mipmap.ic_error));
ImageLoader的get的過載方法一覽:
public ImageContainer get(String requestUrl, final ImageListener listener) {
return get(requestUrl, listener, 0, 0);
}
public ImageContainer get(String requestUrl, ImageListener imageListener,
int maxWidth, int maxHeight) {
return get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
}
public ImageContainer get(String requestUrl, ImageListener imageListener,
int maxWidth, int maxHeight, ScaleType scaleType) {
~~~
}
ImageLoader.getImageListener原始碼一覽:
/**
* The default implementation of ImageListener which handles basic functionality
* of showing a default image until the network response is received, at which point
* it will switch to either the actual image or the error image.
* @param view The imageView that the listener is associated with.
* @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
* @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
*/
public static ImageListener getImageListener(final ImageView view,
final int defaultImageResId, final int errorImageResId) {
return new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (errorImageResId != 0) {
view.setImageResource(errorImageResId);
}
}
@Override
public void onResponse(ImageContainer response, boolean isImmediate) {
if (response.getBitmap() != null) {
view.setImageBitmap(response.getBitmap());
} else if (defaultImageResId != 0) {
view.setImageResource(defaultImageResId);
}
}
};
}
這個方法返回一個預設的監聽器,來給ImageView設定不同狀態下顯示的圖片。引數defaultImageResId,errorImageResId,可設定0,表示沒有預設的圖片id和載入錯誤的圖片id。
/**
*快取bitmap的類
*/
public class BitmapCache implements ImageLoader.ImageCache {
/**
* LruCache最近最少使用的演算法 :記憶體快取。。。
* 當記憶體不充足時,會清除最近最少使用的一些圖片。
*/
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
//獲得到當前應用分配的最大記憶體
// 一般分1/8記憶體給圖片做快取用
int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount(); //返回當前要快取圖片的大小
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
if (getBitmap(url) == null){ //如果當前快取中沒有url對應的圖片,我們再存到記憶體快取
mCache.put(url, bitmap);
}
}
}
NetworkImageView帶下載功能的ImageView
NetworkImageView拓展了ImageView實現了下載的功能,(相對於使用普通的ImageView,避免由於控制元件重用帶來的圖片錯位的問題)。使用方法:
- 把使用到ImageView的地方替換成NetworkImageView
- 初始化ImageLoader
- 通過NetWorkImageView物件設定下載圖片的配置資訊(如最大寬高等)
- 通過NetWorkImageView物件呼叫setImageUrl方法進行圖片的下載
示例如下:
//事先初始化好的RequestQueue和ImageLoader
RequestQueue requestQueue = Volley.newRequestQueue(this);
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
//NetWorkImageView
netiv.setDefaultImageResId(R.mipmap.ic_default); //設定預設的圖片的id
netiv.setErrorImageResId(R.mipmap.ic_error); //設定下載失敗後的圖片的id
netiv.setImageUrl(url_img, imageLoader); //下載圖片
VolleyUtils
對Volley進行再一次的封裝,方便我們的使用:
package com.alex.week06_02.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;
import com.alex.week06_02.BitmapCache;
import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.Map;
/**
* 單例模式對Volley進行簡單封裝
* @author noonecode
*/
public class VolleyUtils {
private static VolleyUtils mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private ImageLoader.ImageCache mCache;
private VolleyUtils(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
mCache = new BitmapCache();
mImageLoader = new ImageLoader(mRequestQueue, mCache);
}
//單例模式
public VolleyUtils newInstance(Context context) {
if (mInstance == null) {
synchronized (VolleyUtils.class) {
if (mInstance == null) {
mInstance = new VolleyUtils(context);
}
}
}
return mInstance;
}
public RequestQueue getRequestQueue() {
return mRequestQueue;
}
public ImageLoader getImageLoader(){
return mImageLoader;
}
/**
* 傳送一個字串請求
* @param method 請求方式GET/POST
* @param url 請求的連結
* @param params POST請求時的引數,可為null
* @param listener 請求返回資料的監聽器
* @param errorListener 請求發生錯誤的監聽器
*/
public void sendStringRequest(final int method, String url, final Map<String, String> params, Response.Listener<String> listener,
Response.ErrorListener errorListener){
StringRequest stringRequest = new StringRequest(method, url, listener, errorListener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
if (method == Method.POST) {
return params;
}
return null;
}
};
mRequestQueue.add(stringRequest);
}
/**
* 傳送一個字串請求
* @param url 圖片的連結
* @param listener 成功獲取到Bitmap的監聽器
* @param maxWidth 最大寬度,0則不限制
* @param maxHeight 最大高度,0則不限制
* @param scaleType ImageView的拉伸屬性
* @param decodeConfig 圖片的格式
* @param errorListener 失敗的監聽器
*/
public void sendImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
ImageView.ScaleType scaleType, Bitmap.Config decodeConfig, Response.ErrorListener errorListener){
ImageRequest imageRequest = new ImageRequest(url, listener, maxWidth, maxHeight, scaleType, decodeConfig, errorListener);
mRequestQueue.add(imageRequest);
}
}
使用方法:
1. 首先通過單例的方法獲得出VolleyUtils的物件
private VolleyUtils mVolleyUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//~~~
mVolleyUtils = VolleyUtils.newInstance(this);
}
發出一個字串的請求:
mVolleyUtils.sendStringRequest(Request.Method.GET, "https://www.baidu.com", null, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tvShow.setText(response);
}
}, null);
發出一個圖片請求:
mVolleyUtils.sendImageRequest("https://www.baidu.com/img/bd_logo1.png", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iv_show.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, null);
(完畢,如果您(❤ ω ❤)喜歡,請支援點贊)
相關推薦
Android Volley框架詳解
注:文章出自http://blog.csdn.net/guolin_blog/article/details/17482095,有興趣可以先去閱讀。 Volley簡介 對於Android系統網路通訊,我們知道目前用的最普遍的就是HttpClient和HttpURLConnection,但是H
Android Volley框架使用詳解
Volley瞭解 Volley的中文翻譯為“齊射、併發”,是在2013年的Google大會上釋出的一款Android平臺網路通訊庫,具有網路請求的處理、小圖片的非同步載入和快取等功能,能夠幫助 Android APP 更方便地執行網路操作,而且更快速高效。
Android MVC開發框架詳解
div ada 2-2 展示 gpo lose 回調接口 cycle recycler 1、目錄根據需要自行添加 adapter 用於RecyclerView、ListView 等各種適配器 fragment 存放fragment model
Android 7.0 IMS框架詳解
本文主要講解IP Multimedia Subsystem (IMS)在Android 7.0上由谷歌Android實現的部分內容。 從APP側一直到Telephony Framework,是不區分CS流程還是PS流程的。到了Telephony Framework模組,
Android Transition Framework 詳解 --- 超炫的動畫框架
前言 早在Android 4.4,Transition 就已經引入,但在5.0才得以真正的實現。而究竟Transition是用來幹嘛的呢。接下來我將通過例項和原理解析來分析下Google這個強大的動畫框架。 先來張效果圖鎮住場面 Google Play上的New
ijkplayer-android框架詳解
ijkplayer是一個基於ffplay的輕量級Android/iOS視訊播放器,實現了跨平臺的功能,API易於整合;編譯配置可裁剪,方便控制安裝包大小。 本文重點分析其C語言實現的核心程式碼,涉及到不同平臺下的封裝介面或處理方式時,均以Android平臺為例。一、FFpl
Android中鴻洋封裝的OkHttp框架詳解
1下載並依賴jar包 OKhttp官網: 在這裡下載okhttputils-2_6_2.jar 2加許可權 <uses-permission android:name="andro
jQuery Validate驗證框架詳解
lec false 樣式 廈門 adding 常用 invalid util 類名 jQuery校驗官網地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一、導入js庫 <scri
(轉) shiro權限框架詳解04-shiro認證
software protected .get 打開 net 文件的 apach stc cdc http://blog.csdn.net/facekbook/article/details/54906635 shiro認證 本文介紹shiro的認證功能 認證流程
(轉)shiro權限框架詳解05-shiro授權
roles ktr ase sub turn stp exc protected user http://blog.csdn.net/facekbook/article/details/54910606 本文介紹 授權流程 授權方式 授權測試 自定義授權rea
(轉)shiro權限框架詳解06-shiro與web項目整合(下)
tex web項目 ssd ndis form認證 lec rfi 出身 javadoc http://blog.csdn.net/facekbook/article/details/54962975 shiro和web項目整合,實現類似真實項目的應用 web項目中
aNDROID之MEDIapLaYER詳解
iap music media 詳解 list oid aid 5% layer %E8%BD%AC%E8%BD%BD%E4%B8%80%E4%B8%AA%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E5%B7%A5%E5%85%B7%E7%B1
Django框架詳解
ews ref mode 分享 png django 剖析 href http 一、WSGI剖析 二、Django-url路由系統 三、Django-views視圖與邏輯處理 四、Django-Models與ORM 五、Django-Template模板
Hadoop學習筆記:MapReduce框架詳解
object 好的 單點故障 提高 apr copy 普通 exce 代表性 開始聊mapreduce,mapreduce是hadoop的計算框架,我學hadoop是從hive開始入手,再到hdfs,當我學習hdfs時候,就感覺到hdfs和mapreduce關系的緊密。這個
Android RxJava操作符詳解系列: 變換操作符
urn 原因 轉換 需要 生產 依賴 reat 入門 所有 Rxjava,由於其基於事件流的鏈式調用、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。Github截圖 如果還不了解 RxJava,請看文章:Android:這是一篇 清晰 &
jmapper框架詳解(前言)
git 方便 再看 嘗試 寫博客 後繼 測試 如果 個人 第一次寫博客,各種不足之處還望理解。 由於項目需要,項目經理在原來的ssm+duubo+mq框架上加入jmapper框架,本來以為是一個很簡單的ORM框架,幾天就搞定了。誰知道自己太笨,整了近一個月才把業務嵌
Fork/Join框架詳解
ceo font print 捕獲異常 rri 完成 ddl 取數據 sys Fork/Join框架是Java 7提供的一個用於並行執行任務的框架,是一個把大任務分割成若幹個小任務,最終匯總每個小任務結果後得到大任務結果的框架。Fork/Join框架要完成兩件事情:
hadoop框架詳解
con 完成 shu ati 默認 logs 應用 sso 分布式存 Hadoop學習隨筆(參考:http://blog.csdn.net/mobanchengshuang/article/details/78786652) Hadoop項目主要包括以下四個模塊 ◆ Had
android:exported 屬性詳解
itl fas 默認 之前 綁定 四大 nbsp ring ins http://blog.csdn.net/watermusicyes/article/details/46460347 昨天在用360掃描應用漏洞時,掃描結果,出來一個android:exported屬性,
Java集合框架詳解
dha put 同時 列表 true 是個 獲取 pac .com 一、集合框架圖 簡化圖: 說明:對於以上的框架圖有如下幾點說明 1.所有集合類都位於java.util包下。Java的集合類主要由兩個接口派生而出:Collection和Map,Collection和M