安卓開發之Volley的基本使用
一、Volley概述
- Volley 是Android上的一個網路通訊庫,能使網路通訊更簡單健壯。
- Volley 適合資料量不大但通訊比較頻繁的場景。
二、相關的API
RequestQueue:請求佇列,會自動執行佇列中的請求
Volley.newRequestQueue(context):建立一個請求佇列
addRequest(Request request):將請求新增到佇列中處理
Request:請求的介面
StringRequest:獲取字串資料的網路請求
JsonRequest:獲取JSON資料的網路請求
ImageRequest:獲取圖片結果的網路請求
三、使用Volley進行GET網路請求
一、StringRequest示例
RequestQueue requestQueue ;
private String path = "http://apis.baidu.com/apistore/idservice/id=11111";
//獲取請求佇列例項
requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, path, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//在主執行緒中進行返回資料處理
Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//在主執行緒中執行TODO
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
});
// 加入佇列
requestQueue.add(stringRequest);
三、使用Volley進行POST網路請求
一、StringRequest示例
RequestQueue requestQueue ;
private String path = "http://apis.baidu.com/apistore/weatherservice/citylist";
requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, path, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//在主執行緒中執行
Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//在主執行緒中執行TODO
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//設定提交請求的引數
Map<String, String> params = new HashMap<String, String>();
params.put("city","%E6%9C%9D%E9%98%B3");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
//設定提交請求的頭部資訊
return super.getHeaders();
}
};
// 加入佇列
requestQueue.add(stringRequest);
二、JsonObjectRequest示例
注:JsonObjectRequest 不能重寫 getParams 來傳參
RequestQueue requestQueue ; private String path = "http://apis.baidu.com/apistore/weatherservice/citylist"; //獲取請求佇列例項 requestQueue = Volley.newRequestQueue(this); //設定請求引數 String params = "city=%E6%9C%9D%E9%98%B3"; //在構造方法中傳參,不能通過getParams來傳參 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, path, params, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Toast.makeText(MainActivity.this,response.toString(),Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show(); } }); requestQueue.add(jsonObjectRequest);
四、使用Volley來載入圖片
一、使用ImageRequest獲取圖片bitmap
RequestQueue requestQueue ;
//獲取請求佇列例項
requestQueue = Volley.newRequestQueue(this);
//圖片地址
String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg";
/*
* ImageRequest的構造方法的引數說明:
* 第一個引數:圖片url,第二個引數:響應監聽器
* 第三個引數、第四個引數:分別用於指定允許圖片最大的寬度和高度.
* 如果指定的網路圖片的寬度或高度大於這裡的最大值,則會對圖片進行壓縮.
* 指定為0的話就表示不管圖片有多大,都不會進行壓縮。
* 第五個引數:scaletype.圖片的填充方式
* 第六個引數:指定圖片的顏色屬性.
* ARGB_8888可展示最好的顏色屬性,每個圖片畫素佔據4個位元組的大小.
* RGB_565則表示每個圖片畫素佔據2個位元組大小
* 第七個引數:請求失敗後的回撥
*
*/
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
Toast.makeText(MainActivity.this,"success",Toast.LENGTH_SHORT).show();
((ImageView)MainActivity.this.findViewById(R.id.imageView)).setImageBitmap(response);
}
}, 200, 200, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
});
requestQueue.add(imageRequest);
二、使用ImageLoader載入圖片
ImageLoader的內部是使用ImageRequest來實現的,不過ImageLoader要比ImageRequest更加高效,它不僅可以對圖片快取ImageCache,還可以過濾掉重複的連結,避免重複傳送請求。
RequestQueue requestQueue ; //獲取請求佇列例項 requestQueue = Volley.newRequestQueue(this); ImageView imageView = (ImageView) findViewById(R.id.imageView); String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg"; /* 第一個引數:RequestQueue物件。 * 第二個引數是一個ImageCache物件。 * BitmapCache為ImageCache子類,起到圖片快取的作用 */ ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache()); /* 第一個引數:顯示圖片的ImageView控制元件. * 第二個引數:載入圖片時顯示的圖片. */ 第三個引數:載入圖片失敗時顯示的圖片。 ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView,R.drawable.default_img,R.drawable.error_img); //第三個引數、第四個引數:分別用於指定允許圖片最大的寬度和高度. imageLoader.get(url,imageListener,200,200);
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
//將快取圖片的總大小設定為10M
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
三、使用NetworkImageView來載入圖片
NetworkImageView是一個自定義控制元件,繼承自ImageView,在ImageVie的基礎之上加入了載入網路圖片的功能。
<com.android.volley.toolbox.NetworkImageView android:layout_width="220dp" android:layout_height="220dp" android:id="@+id/imageView" android:scaleType="centerInside" />
NetworkImageView在載入圖片時,會自動獲取自身的寬高,然後與網路圖片的寬高對比,再決定是否需要對圖片進行壓縮。
當不想對圖片進行壓縮,可在佈局檔案中把NetworkImageView的屬性layout_width和layout_height設定成wrap_content.NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView); networkImageView.setDefaultImageResId(R.drawable.default_img); networkImageView.setErrorImageResId(R.drawable.error_img); String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg"; ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache()); networkImageView.setImageUrl(url,imageLoader);
NetworkImageView控制元件的用法要比前兩種方式更加簡單,不需要再建立一個ImageListener。
五、request請求的取消
如果在Activity裡啟動了volley網路請求,那麼在Activity銷燬之前應將還沒完成的請求/未啟動的請求進行取消以釋放記憶體資源。
public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue; // Assume this exists.
//給請求設定標記
stringRequest.setTag(TAG);
...
...
@Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
相關文章
- Android Volley 基本使用Android
- 安卓開發之Fragment的使用與通訊安卓Fragment
- iOS開發之使用Git的基本使用(二)iOSGit
- iOS開發之使用Git的基本使用(一)iOSGit
- 安卓開發之訊息機制和AsyncTask實現的基本原理安卓
- 快速Android開發系列網路篇之VolleyAndroid
- 安卓開發之服務Service安卓
- 安卓開發之 App Widget安卓APP
- 安卓開發之呼叫攝像頭安卓
- 安卓旅途之——開發數獨(一)安卓
- 安卓旅途之——開發數獨(二)安卓
- 安卓開發之Activity的4種啟動模式安卓模式
- 安卓開發之資料儲存方式安卓
- 安卓旅途之——開發數獨(總結)安卓
- 安卓微信小程式開發之“藍芽”安卓微信小程式藍芽
- go web開發(gin&gorm) 之DB配置及DAO的基本使用GoWebORM
- 安卓開發之ViewDragHelper的使用及自定義可下拉展示內容的ViewGroup安卓View
- Flutter 外掛開發之引入aar到安卓部分 並使用本地mavenFlutter安卓Maven
- 安卓開發之網路請求HttpURLConnection安卓HTTP
- 安卓開發_WebView如何在Fragment中使用安卓WebViewFragment
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- 安卓中高階開發工程師之——未來的路安卓工程師
- 安卓開發之廣播接收器BroadcastReceiver安卓AST
- 安卓開發中RecycleView簡單使用步驟安卓View
- 安卓開發的小技巧(2)安卓
- 安卓開發的小技巧(1)安卓
- 安卓開發的小技巧(3)安卓
- 安卓開發小組的反思安卓
- iOS開發之XLForm的使用iOSORM
- 使用uniapp開發APP時的除錯/安卓打包等APP除錯安卓
- iOS開發- UILabel的基本介紹與使用iOSUI
- 安卓開發之樣式和主題的使用與夜間/白天模式的動態轉換安卓模式
- Android應用開發:網路工具——Volley(二)Android
- 安卓中高階開發面試知識點之——快取安卓面試快取
- QT之安卓開發——生成APK以及真機測試QT安卓APK
- 02python開發之基本運算子Python
- 驅動開發之基本資料結構資料結構
- 安卓基礎開發庫,DevRing使用說明安卓devVR