Voley简介
Android系统中主要提供两种方式进行HTTP通信,HttpURLConnection和HttpClient。在进行使用的时候如果不进行封装,很容易出现很多重复的代码。
Google推出网络通信框架Volley。Volley可进行HTTP通信,也可以加载网络上的图片。Volley适合进行数据量不大,但通信频繁的网络操作,不适合大数据量的网络通信。
使用Volley发送HTTP请求
1.StringRequest
基本步骤:1.创建一个RequestQueue的对象 2.创建一个StringRequest对象 3.将StringRequest对象添加到RequestQueue中
RequestQueue mQueue= Volley.newRequestQueue(this);
StringRequest request=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.d("TAG", String.valueOf(error));
}
});
mQueue.add(request);
上面的HTTP的请求方式是GET,请求方式是POST可以选四个参数的构造方法:
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, listener, errorListener);
2.JsonRequest
基本步骤:1.创建一个RequestQueue的对象 2.创建一个JsonObjectRequest或JsonArrayRequest对象 3.将对象添加到RequestQueue中
JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,第一个是用于请求一段JSON数据的,第二个是用于请求一段JSON数组的
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("url", 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);
}
});
使用Volley实现加载网络图片
1.ImageRequest
基本步骤:1.创建一个RequestQueue的对象 2.创建一个ImageRequest对象 3.将ImageQueue对象添加 添加到RequestQueue里面。
RequestQueue mQueue= Volley.newRequestQueue(this);
ImageRequest imageRequest=new ImageRequest("http://avatar.csdn.net/2/8/6/2_lichongya.jpg", new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
},0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.mipmap.ic_launcher);
}
});
mQueue.add(imageRequest)
ImageRequest的构造函数包括6个参数,第一个是加载图片的URL的地址,第二个是图片请求成功时调用对应第七个参数是图片请求失败的时候调用,第三和第四个参数指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个是图片的颜色属性,第六个是ScaleType属性,Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分。
2.ImageLoader
和ImageRequest相比,ImageLoader的好处是可以对图片进行缓存,还可以过滤掉重复的链接,避免发送同样的请求。
基本步骤:1.创建一个RequestQueue的对象 2.创建一个ImageLoader对象 3.创建一个ImageListener对象 4.调用ImageLoader的get方法加载网络上的数据。
ImageLoader imageLoader=new ImageLoader(mQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
ImageLoader.ImageListener imageListener=imageLoader.getImageListener(imageView,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageListener);
ImageLoader的构造函数包含两个参数,第一个就是我们自己创建的RequestQueue对象,第二个是ImageCache对象,在这个里面我们可以添加图片缓存的作用。
ImageLoader的getImageListener()方法能够获取到一个ImageListener对象,getImageListener()方法接收三个参数,第一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
ImageLoader的get方法包含两个参数,第一个是图片的URL的地址,第二个是ImageListener对象。
3.NetWorkImageView
基本步骤:1.创建一个RequestQueue的对象 2.创建一个ImageLoader的对象 3.在布局文件中创建NetWorkImageView控件 4.加载图片
布局文件:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/netImageView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
ImageLoader imageLoader=new ImageLoader(mQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
// ImageLoader.ImageListener imageListener=imageLoader.getImageListener(imageView,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
// imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", imageListener);
netImageView.setDefaultImageResId(R.mipmap.ic_launcher);
netImageView.setErrorImageResId(R.mipmap.ic_launcher);
netImageView.setImageUrl("http://avatar.csdn.net/2/8/6/2_lichongya.jpg", imageLoader);
mageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩。NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。这是由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩