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 one rrorResponse(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 one rrorResponse(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 one rrorResponse(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 = https://www.cnblogs.com/nhgtx/p/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 one rrorResponse(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 one rrorResponse(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_
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框架是單純的請求資料還是加載圖片都要記住,它不適合體量較大的網路請求,
以上三種加載網路圖片的方式最終都能得到成果圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/538232.html
標籤:Android
