Volley是Google在2013年5月15日到17日在舊金山Moscone中心舉辦網路開發者年會中推出的Android非同步網路載入框架和圖片載入框架,它特別適合資料體量小且通訊頻繁的網路操作場景,而Android開發中大多數場景都是這樣的,但是如果讓它去進行檔案上傳下載之類的巨量資料量網路操作,那麼他的表現將非常差。
那麼讓我們走進Volley,來熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一個圖片載入框架NetworkImageView,我們也來一起了解一下吧。
Volley的歷史不短,但是它的修改卻很少,現在最高的版本也才1.2.1。我們使用的是1.1.1版本,現在build.gradle(app)中的dependencies中匯入依賴
implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'
// 請求地址
String src = "https://www.baidu.com";
// 建立請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 建立請求
StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功時返回的response資料
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
String message = error.getMessage();
System.out.println(message);
}
});
// 將請求新增至佇列中,否則不會發起請求
requestQueue.add(request);
直接在MainActivity中進行網路請求,這與我們之前的方式不太一樣,這是因為Volley請求程式碼比OkHtpp還要簡短,監聽都可以new+空格+回車 自動彈出,我們只需要管理返回的資料即可,而且建立的請求佇列並不只能使用一次,這是一個佇列,可以加入多個請求,所以,我們只需要建立請求並且匯入到這個佇列中即可。
post請求比get請求多一些引數,首先就是在建立請求時要去指定請求為post,因為預設請求時get,其次需要重寫一個方法用於傳遞post請求所攜帶的引數,如果不這麼做的話,就會報錯。
// 請求地址
String src = "https://xxx.xxx.com";
// 建立請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 建立請求,新增請求型別
StringRequest request = new StringRequest(Request.Method.POST ,src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功時返回的response資料
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
String message = error.getMessage();
System.out.println(message);
}
}){
// post請求一定要傳入引數否則報錯
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("username","123456");
map.put("password","123456");
return map;
}
};
// 將請求新增至佇列中,否則不會發起請求
requestQueue.add(request);
Put請求就不說了,只需要修改請求方法即可
delete請求如果需要攜帶引數,可以在post請求的基礎上修改請求方法,如果不攜帶引數可以在get請求的基礎上新增請求方法。
我們注意到了,我們返回的都是String型別的值,我們日常開發中返回的值大多數時json格式的,那麼我們怎麼樣去請求json資料呢。Volley提供了JsonObjectRequest和JsonArrayRequest這兩個類可用於返回json資料。它的使用方法和StringRequest是一樣的,只需要修改一些引數即可。另外他不在需要通過重寫方法來傳遞引數,可以直接將你需要的引數轉換成json格式,在範例化JsonObjectRequest時傳入
// 請求地址
String src = "https://www.baidu.com";
// 建立請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 建立請求,新增請求型別
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功時返回的response資料
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
String message = error.getMessage();
System.out.println(message);
}
});
// 將請求新增至佇列中,否則不會發起請求
requestQueue.add(request);
// 請求地址
String src = "https://www.baidu.com";
// 建立請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 建立引數
JSONObject data = new JSONObject();
try {
data.put("username","123");
data.put("password","123");
} catch (JSONException e) {
e.printStackTrace();
}
// 建立請求,新增請求型別
// 順序是 請求方法 請求地址 請求攜帶的資料 監聽器
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功時返回的response資料
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
String message = error.getMessage();
System.out.println(message);
}
});
// 將請求新增至佇列中,否則不會發起請求
requestQueue.add(request);
在post基礎上修改請求方法即可
判斷是否攜帶引數並且post或get中修改即可
這種方法是通過ImageRequest來請求一張圖片轉換為Bitmap格式,在返回的Bitmap中對ImageView進行設定圖片,較為簡單。
img = (ImageView) findViewById(R.id.img);
// 建立連結
String url = "圖片連結";
// 建立佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 建立圖片請求
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
img.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
// 新增進佇列
requestQueue.add(imageRequest);
這種方法對比起上一種來說要更加複雜一些,我們需要先新建一個類實現ImageLoader.ImageCache介面
public class BitmapCache implements ImageLoader.ImageCache{
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
//設定圖片最大值
int maxSize = 10*1024;
mCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
}
然後再去MainActivity中去建立ImageLoader,它不需要我們去設定圖片,只需要將圖片作為一個引數傳遞進去,它會幫我們自動載入進ImageView中。
img = (ImageView) findViewById(R.id.img);
// 建立連結
String url = "圖片連結";
// 建立佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 建立圖片請求
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 設定圖片載入監聽,設定預設圖片和載入錯誤圖片
ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
// 發起請求
imageLoader.get(url,imageListener);
除了使用ImageView載入圖片,Volley還提供了一個元件就是NetworkImageView,我們在佈局檔案上使用它。
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.android.volley.toolbox.NetworkImageView>
它同樣需要前面的BitmapCache類,因為他也需要ImageLoder。
img = (NetworkImageView) findViewById(R.id.img);
// 建立連結
String url = "圖片地址";
// 建立佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 建立一個ImageLoader
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 預設圖片和異常圖片設定
img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
img.setErrorImageResId(R.drawable.ic_home_black_24dp);
// 載入圖片
img.setImageUrl(url,imageLoader);
不管你使用的是Volley框架是單純的請求資料還是載入圖片都要記住,它不適合體量較大的網路請求。
以上三種載入網路圖片的方式最終都能得到成果圖