1.volley是android上的网络通信库
2.volley通信的特点:
1.通信更快更简洁
2.可以处理get/post网络请求以及网络图像的高效率的异步请求
3.可以处理网络请求图片的加载和缓存
4.可以取消请求
5.和activity生命周期的联动,activity销毁后,请求同时关闭。
6.不适合做上传和下载的的操作
3.请求的对象有:
StringRequest是普通http请求,
JsonObjectRequest,JsonArrayRequest::JsonRequest可以封装json数据,并将服务端的返回数据封装成JsonObject,
ImageRequest可以请求一张网络图片,并将服务端的返回数据封装成Bitmap。
4.volley的get/post请求方式的时候用。
volley使用及其简单,我们只需要创建一个RequestQueue请求队列,然后往队列里面扔http请求即可,volley会不断从队列里面取出请求然后交给一堆工作线程处理。这里的http请求是通过Request类来封装的,我们只用创建Request对象,然后提供诸如url之类的参数即可。网络操作全部是在子线程中处理的,我们不必担心阻塞UI线程。网络请求的结果会异步返回给我们,我们只需要处理Request的回调即可。
1.导入volley.jar文件到libs中
2.请求创建好一般会放到请求队列中去,所以我在application中创建了一个全局共享RequestQueue
public class MyApplication extends Application {
// 创建一个全局的请求队列
public static RequestQueue queues;
@Override
public void onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueue(){
return queues;
}
}
注意在manifest.xml文件中进行注册android:name=”.MyApplication”。以及要添加网络请求的权限,需要注意的是,android studio中添加权限和eclipse添加权限不同,as需要手动的添加。
3.创建get请求(StringRequest 和JsonObjectRequest )
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建get请求
Volley_get();
}
private void Volley_get() {
/**
*StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)
* 请求方法,请求的路径,请求成功的监听,请求失败的监听
*/
String url = "";
StringRequest requestGet = new StringRequest(Request.Method.GET, url,new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
}
});
// 设置标签
requestGet.setTag("get");
// 将请求添加到请求队列中
MyApplication.getHttpQueue().add(requestGet);
//如果json数据为空则是get请求,否则是post请求
//如果jsonrequest不为null,volley会将jsonObject对象转化为json字符串原封不动的发给服务器,并不会转成k-v对,因为volley不知道应该如何转化
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null
, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
}
});
// 设置标签
requestGet.setTag("get");
// 将请求添加到请求队列中
MyApplication.getHttpQueue().add(jsonObjectRequest);
}
4.创建post请求(StringRequest 和JsonObjectRequest )
private void Volley_post() {
String url = "";//post请求的链接,值没有在url中传递
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
}
}){
// volley中用于post方法进行参数的传递
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> hashMap = new HashMap<>();
hashMap.put("name", "zhangsan");
hashMap.put("pwd", "123");
return hashMap;
}
};
}
Map<String, String> map = new HashMap<>();
map.put("name", "zhangsan");
map.put("pwd", "123");
JSONObject jsonObject = new JSONObject(map);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
}
});
// 设置标签
jsonObjectRequest.setTag("get");
// 将请求添加到请求队列中
MyApplication.getHttpQueue().add(jsonObjectRequest);
5.volley与activity的生命周期的联动,在onStop()或者是onDestory()方法中取消之前设置的标签即可。
@Override
protected void onStop() {
super.onStop();
MyApplication.getHttpQueue().cancelAll("post");
MyApplication.getHttpQueue().cancelAll("get");
}
6.获取到网络图片imageRequest
LruCache:
ImageCache:
ImageRequest:
ImageLoader:
NetWorkImageView:
/**
* ImageRequest(String url, Listener<Bitmap> listener,
* int maxWidth, int maxHeight, Config decodeConfig, ErrorListener errorListener)
* int maxWidth, int maxHeight, 设置显示的图片的高度和宽度
* Config decodeConfig,以什么样的颜色来显示
*/
String url = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
// 请求成功
mimage.setImageBitmap(bitmap);
}
参数0,0 代表不压缩,100,100代表图片宽高
}, 100, 100, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
mimage.setImageResource(R.mipmap.ic_launcher);
}
});
imageRequest.setTag("image");
MyApplication.getHttpQueue().add(imageRequest);
}
private void initView() {
mimage = (ImageView) findViewById(R.id.image);
}
7.获取到网络图片imageLoader
首先创建RequestQueue不用多说,然后创建ImageLoader实例,同时需要传入请求队列和ImageCache。这个ImageCache是一个接口,我们需要自己实现,它是一个图片缓存,通常我们都是结合LRUCache作为内存缓存使用,当然,如果你不想使用内存缓存,那就给它一个空实现即可。紧接着,需要为ImageLoader绑定ImageView以及图片加载时、图片加载失败时的图片资源。最后调用get方法传入url请求网络。
1.创建bitmapcache的缓存类
public class BitMapCache implements ImageLoader.ImageCache {
private LruCache<String, Bitmap> mCache;
private int max = 10 * 1024 * 1024; // 设置最大的缓存大小
public BitMapCache() {
mCache = new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return mCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
mCache.put(s, bitmap);
}
}
2.在activity中创建imageLoader
ImageLoader imageloader = new ImageLoader(MyApplication.getHttpQueue(), new BitMapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(mimage,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
imageloader.get(url, listener);
8.获取到网络图片networkimageview,该控件任然需要和imageloader搭配使用
<com.android.volley.toolbox.NetworkImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/networkimageview"/>
networkimageview = (NetworkImageView) findViewById(R.id.networkimageview);
ImageLoader imageloader = new ImageLoader(MyApplication.getHttpQueue(), new BitMapCache());
networkimageview.setDefaultImageResId(R.mipmap.ic_launcher);
networkimageview.setErrorImageResId(R.mipmap.ic_launcher);
networkimageview.setImageUrl(url,imageloader);