Android網路請求(4) 網路請求框架Volley Volley是Google在2013年5月15日到17日在舊金山Moscone中心舉辦網路開發者年會中推出的Android非同步網路載入框架和圖片載入框架,它特別適合數據體量小且通訊頻繁的網路操作場景,而Android開發中大多數場景都是這樣的, ...
Android網路請求(4) 網路請求框架Volley
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'
網路請求
Get請求
// 請求地址
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請求
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請求
Put請求就不說了,只需要修改請求方法即可
Delete請求
delete請求如果需要攜帶參數,可以在post請求的基礎上修改請求方法,如果不攜帶參數可以在get請求的基礎上添加請求方法。
Json數據請求
我們註意到了,我們返回的都是String類型的值,我們日常開發中返回的值大多數時json格式的,那麼我們怎麼樣去請求json數據呢。Volley提供了JsonObjectRequest和JsonArrayRequest這兩個類可用於返回json數據。它的使用方法和StringRequest是一樣的,只需要修改一些參數即可。另外他不在需要通過重寫方法來傳遞參數,可以直接將你需要的參數轉換成json格式,在實例化JsonObjectRequest時傳入
Get請求
// 請求地址
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);
Post
// 請求地址
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);
Put
在post基礎上修改請求方法即可
delete
判斷是否攜帶參數並且post或get中修改即可
網路圖片載入框架
1、通過ImageRequest請求網路圖片
這種方法是通過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);
2、通過Imageloader載入圖片
這種方法對比起上一種來說要更加複雜一些,我們需要先新建一個類實現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);
3、通過NetworkImageView載入圖片
除了使用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框架是單純的請求數據還是載入圖片都要記住,它不適合體量較大的網路請求。
以上三種載入網路圖片的方式最終都能得到成果圖