Volley簡介
Volley :在2013年Google I/O大會上推出的新的網(wǎng)絡通信框架。Volley既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader 一樣輕松下載網(wǎng)絡上的圖片苍在。
Volley特別適合數(shù)據(jù)量不大但是通信頻繁的場景。
Volley提供的功能
- JSON,圖像等的異步下載
- 網(wǎng)絡請求的排序
- 網(wǎng)絡請求的優(yōu)先級處理
- 緩存
- 多級別取消請求
- 和Activity和生命周期的聯(lián)動(Activity技術時同時取消所有網(wǎng)絡請求)
Volley中的RequestQueue和Request
- RequestQueue 用來執(zhí)行請求的請求隊列
- Request 用來構(gòu)造一個請求對象
- Request對象主要有以下幾種類型:
- StringRequest 響應的主題為字符串
- JSONArrayRequest 發(fā)死你個和接收JSON數(shù)組
- JsonObjectRequest 發(fā)送和接收JSON對象
- ImageRequest 發(fā)送和接收Image
StringRequest的用法
- 創(chuàng)建一個RequestQueue
private RequestQueue mRequestQueue;
mRequestQueue = Volley.newRequestQueue(this);
- 創(chuàng)建一個StringRequest對象
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.d("TAG", s);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("TAG",volleyError.getMessage(),volleyError);
}
});
- 將StringRequest對象添加到RequestQueue里面
mRequestQueue.add(stringRequest);
JsonRequest
JsonRequest是一個抽象類,無法直接創(chuàng)建它的實例目木,只能從他的子類入手。JsonRequest有兩個子類JsonObjectRequest和JsonArrayRequest懊渡。前者用于請求一段JSON數(shù)據(jù)刽射,后者用于請求一段JSON數(shù)組的军拟。
- 創(chuàng)建一個RequestQueue
private RequestQueue mRequestQueue;
mRequestQueue = Volley.newRequestQueue(this);
- 創(chuàng)建一個JSonObjectRequest對象
其中需要四個參數(shù),第一個參數(shù)是一個URl 誓禁,第二個參數(shù)代表Http方法懈息,第三個和第四個分別是響應監(jiān)聽和響應錯誤監(jiān)聽。分別要覆蓋onResponse()和onErrorResponse()方法摹恰,RequestQueue將會執(zhí)行請求辫继,并響應回調(diào)onResponse()方法,所以要在onResponse()方法中實現(xiàn)自己的業(yè)務邏輯俗慈。
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.weather.com.cn/data/cityinfo/101190404.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Log.d("TAG", jsonObject.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e("TAG",volleyError.getMessage(),volleyError);
}
});
- 將JSonObjectRequest對象添加到RequestQueue里面
mRequestQueue.add(jsonObjectRequest);
ImageRequest的用法
- 創(chuàng)建一個RequestQueue
private RequestQueue mRequestQueue;
mRequestQueue = Volley.newRequestQueue(this);
- 創(chuàng)建一個ImageRequest對象
參數(shù)的具體含義是:第一個參數(shù)是url姑宽,圖片的地址;第二個參數(shù)是Listener是請求響應成功的回調(diào)姜盈;第三個參數(shù)maxWidth是圖片的最大寬度低千;第四個參數(shù)maxHeight是圖片的最大高度配阵;第五個參數(shù)是圖片的顏色屬性馏颂;第六個參數(shù)ErrorListener是請求響應失敗回調(diào)。
注意:如果指定的網(wǎng)絡圖片的寬度或者高度大于這里的最大值棋傍,則會對圖片進行壓縮救拉;指定成0的話,就表示不管圖片多大瘫拣,都不會進行壓縮亿絮。
ImageRequest imageRequest = new ImageRequest("http://img5.duitang.com/uploads/item/201409/14/20140914162144_MBEmX.jpeg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
Toast.makeText(MainActivity.this,"suceess",Toast.LENGTH_SHORT).show();
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
imageView.setImageResource(R.mipmap.ic_launcher);
Toast.makeText(MainActivity.this,"error",Toast.LENGTH_SHORT).show();
}
});
- 將ImageRequest對象添加到RequesQueue里面
mRequestQueue.add(imageRequest);
ImageLoader的用法
- 創(chuàng)建一個RequestQueue對象
- 創(chuàng)建一個ImageLoader對象
- 獲取一個ImageListener對象
- 調(diào)用ImageLoader的get()方法加載網(wǎng)絡上的圖片。
ImageLoader mImageLoader;
mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();
mImageLoader.get(IMAGE_URL,ImageLoader.getImageListener(imageView,R.mipmap.ic_launcher,R.mipmap.failed_image));
NetworkImageView的用法
- 創(chuàng)建一個RequestQueue對象
- 創(chuàng)建一個ImageLoader對象
- 在布局文件中添加一個NetworkImageView控件
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
/>
- 在代碼中獲取該控件的實例
- 設置要加載的圖片的地址
ImageLoader mImageLoader ;
NetworkImageView networkImageView;
networkImageView =(NetworkImageView)findViewById(R.id.network_image_view);
mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();
networkImageView.setImageUrl(IMAGE_URL,mImageLoader);