volley框架的使用
volley框架的基本使用
使用的原因
Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码
主要就是进行了以下三步操作:
创建一个RequestQueue对象。创建一个XXXXXRequest对象。将XXXXXXRequest对象添加到RequestQueue里面。字符串的请求
第一步获取到RequestQuene对象
RequestQueue mQueue = Volley.newRequestQueue(context);
关于RequestQuene
RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
第二步创建StringRequest对象
第一个参数是url地址,第二个参数是请求成功处理返回来的数据 第三个参数是请求失败进行的处理
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener() {
@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);
}
});
第三步需要将stringRequest添加到mQuene里面即可
mQueue.add(stringRequest);
JsonObjectRequest请求
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
new Response.Listener() {
@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);
}
});
其中response.toString()
就是返回来的数据只需要处理器就行
ImageRequest请求
ImageRequest request = new ImageRequest("http://www.2cto.com/uploadfile/Collfiles/20141103/201411030837265.png", new Response.Listener() {
@Override
public void onResponse(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
},0,0, ImageView.ScaleType.MATRIX,Bitmap.Config.ARGB_8888,new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
image.setImageResource(R.drawable.ic_empty);
}
});
ImageLoader
ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
由于ImageLoader已经不是继承自Request的了,所以它的用法也和我们之前学到的内容有所不同
总结起来大致可以分为以下四步:
创建一个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;
}
});
ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象
接下里创建ImageListen对象
ImageListener listener = ImageLoader.getImageListener(imageView,
R.drawable.default_image, R.drawable.failed_image);
最后,调用ImageLoader的get()方法来加载图片
imageLoader.get("http://www.2cto.com/uploadfile/2016/0413/20160413101119415.jpeg", listener);
可以控制其大小
imageLoader.get(“http://www.2cto.com/uploadfile/2016/0413/20160413101119415.jpeg“,
listener, 200, 200);
想要写一个好的ImageCache对象 需要用到Android的LruCache功能了
public class BitmapCache implements ImageCache {
private LruCache mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache(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);
}
}
这里我们将缓存图片的大小设置为10M。接着修改创建ImageLoader实例的代码,第二个参数传入BitmapCache的实例,如下所示:
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
NetworkImageView的用法
需要遵循以下五步:
创建一个RequestQueue对象。创建一个ImageLoader对象。在布局文件中添加一个NetworkImageView控件。在代码中获取该控件的实例。设置要加载的图片地址。第一第二步
RequestQueue requestQueue = VolleyUtil.getQueue(getActivity());
ImageLoader loader = new ImageLoader(requestQueue,new LruImageCache());
首先修改布局文件中的代码,在里面加入NetworkImageView控件,如下所示:
然后获取控件
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
到了NetworkImageView控件的实例之后,我们可以调用它的setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法来分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址,如下所示:
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("http://www.2cto.com/uploadfile/Collfiles/20141103/201411030837265.png",