volley框架:
1、参考了已有框架的优点
2、开源
特点:
1.自动调度网络请求,并在子线程中执行
2.多个并发的网络连接
3.通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
4.支持请求优先级
5.支持取消请求的强大API,可以取消单个请求或多个
核心对象:
RequestQueue 用来执行请求的请求队列
Request 用来构造一个请求对象
Request对象主要有以下几种类型:
StringRequest 响应的主体为字符串
JsonArrayRequest 发送和接收JSON数组
JsonObjectRequest 发送和接收JSON对象
ImageRequest 发送和接收Image
RequestQueue mQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest("http://route.showapi.com/6-1?showapi_appid=19987&showapi_sign=b9054b15df244f6a88588f33cd4372ea&num=15093238875\n",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
Volley的基本使用
1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
//开发流程
RequestQueue mQueue = Volley.newRequestQueue(context);
//是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回
调。
StringRequest stringRequest = new StringRequest(url,Listener,ErrorListener);
mQueue.add(stringRequest);
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
```
JsonObjectRequest、JsonArrayRequest、StringRequest的用法
//null:参数json格式
JsonObjectRequest stringRequest = new JsonObjectRequest(url,null,Listener,ErrorListener);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
//长按事件
**.setOnLongClickListener(new View.OnLongClickLinstener(){
public booblen onLongClick(View v){
return flase;//flase表示不再向下传递,true表示从父标记向下传递此状态,子标记共享此事件
}
}
Post传参:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
//POST是常量,此处的Method.POST表示用POST的方法传参
重写StringRequest类的getParams()方法。
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
post,get
get:效率高,2k,
post:可以提交大数据量,传递非英文字符,
图片加载
使用ImageRequest下载图片
ImageRequest imageRequest = new ImageRequest(url,Listener,0,0,Config.RGB_565,ErrorListener);
ImageRequest imageRequest = new ImageRequest(
"http://developer.android.com/images/home/aw_dac.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.drawable.default_image);
}
});
ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。
使用ImageLoader
- 创建一个RequestQueue对象。
- 创建一个ImageLoader对象。
- 获取一个ImageListener对象。
- 调用ImageLoader的get()方法加载网络上的图片。
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
//一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.default_image, R.drawable.failed_image);
imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
//指定图片允许的最大宽度和高度
imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
listener, 200, 200);
//这里我们将缓存图片的大小设置为10M。
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
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);
}
}
使用NetworkImageV
ImageLoader loader=new ImageLoader(RequestQueue, ImageCache)
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
imageLoader);
取消Request
Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。一般写在Activity的onStop方法中。
1)可以针对某些个request做取消操作:
@Override
public void onStop() {
for (Request <?> req : mRequestQueue) {
req.getTag().equals()
req.cancel();
}
}
2)取消这个队列里的所有请求:
//可以在Activity中设置一个常量TAG,给每一个request.setTag,取消对应Tag让请求就可以了
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
mRequestQueue.cancelAll(this);
}
//可以通过setTag方法为每一个Request添加tag
req.setTag(“Tag”);
//取消Request
reqQueue.cancelAll(“Tag”);
设置请求优先级
在实际开发中我们常常需要提高一些请求的优先级以便优先执行,可以通过覆写getPrioriity()方法
//优先级有LOW,NORMAL,HIGH,IMMEDIATE
private Priority priority = Priority.HIGH;
StringRequest strReq = new StringRequest(Method.GET,
Const.URL_STRING_REQ,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());
msgResponse.setText(response.toString());
hideProgressDialog();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hideProgressDialog();
}
}) {
@Override
public Priority getPriority() {
return priority;
}
};