在我们android开发过程中不可避免的要进行网络访问,android为我们提供了两种方式来访问网络:HttpURLConnection和HttpClient
而使用这两种类来访问网络的时候仍然需要大量的代码来实现,而且对于不熟练的人来说很容易出错。
并且由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以在Android 5.1中,HttpClient类已被废弃。
谷歌为了使网络访问更加简易在2013年推出了Volley。
1、默认Android2.3及以上HttpURLConnection(因为2.3以下这个类有很多Bug),2.3以下使用HttpClient;
2、缓存机制优秀;
3、请求队列可以针对优先级排序;
4、提供多种取消机制;
5、图片加载异常简单(这项比较重要,不需要考虑内存优化和图片加载时的内存溢出);
6、使用非常简单;
7、官方提供,必须是精品啊。
不足:Volley在轻量的网络访问中表现优秀,但是对于流媒体和大数据文件的传输支持不够。
基于以上种种原因我们使用Volley。
首先我们要下载Volley。
谷歌gitbut地址:
https://android.googlesource.com/platform/frameworks/volley
也可以从我的csdn资源上下载:
http://download.csdn.net/download/baidu_31093133/9511419
将下载的jar包复制到android工程的libs目录下。
首先说一下volley的requestQueue,使用volley的第一步就是建立一个这样的请求队列用于存放自己的网络请求。
通常我们会在application里建立一个全局的请求队列。
如下:
public class MyApplication extends Application {
//建立一个请求队列
public static RequestQueue queues;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
//实例化一个请求队列
queues = Volley.newRequestQueue(getApplicationContext());
}
//建立方法返回请求队列
public static RequestQueue getHttpQueues() {
return queues;
}
}
//定义一个url
String url = " http://op.juhe.cn/onebox/weather/query?cityname=%E6%B8%A9%E5%B7%9E&key=5fc2b142029b1b0d371d5449a8b8927d";
//定义一个StringRequest
StringRequest request = new StringRequest(Method.GET, url, new
Listener() {// 添加请求成功监听
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, "网络访问成功"+,
Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {// 添加请求失败监听
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(),
Toast.LENGTH_LONG).show();
}
});
// 设置请求的tag标签,便于在请求队列中寻找该请求
request.setTag("lhdGet");
// 添加到全局的请求队列
MyApplication.getHttpQueues().add(request);
//同样实例化一个JsonObjectRequest
JsonObjectRequest request2 = new JsonObjectRequest(Method.GET, url, null, new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
}
});
// 设置请求的tag标签,便于在请求队列中寻找该请求
request2.setTag("lhdGet2");
// 添加到全局的请求队列
MyApplication.getHttpQueues().add(request2);
1、创建一个RequestQueue
2、创建一个ImageRequest
3、将ImageRequest添加到RequestQueue
事实上StringRequest,JsonRequest和ImageRequest都是继承自Request的所以它们的用户也都类似。
示例:
ImageRequest imageRequest = new ImageRequest(
http://img1.imgtn.bdimg.com/it/u=2680373034,1460593141&fm=21&gp=0.jpg",
new Response.Listener() {
@Override
//请求成功回调
public void onResponse(Bitmap response) {
//加载网络图片
imageView.setImageBitmap(response);
}
//0,0表示最大宽和高 RGB_565是颜色模式
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
//请求失败回调
public void onErrorResponse(VolleyError error) {
//设置访问失败加载的图片 imageView.setImageResource(R.drawable.default_image);
}
});
最后将这ImageRequest对象添加到RequestQueue里。
ImageLoader的内部是使用ImageRequest来实现的,但它ImageLoader更高效,因为它不仅可以缓存图片,还可以防止重复发送同样的请求。
1、创建一个RequestQueue
2、创建一个ImageLoader
3、自定义一个类继承ImageCache
4、创建一个ImageListener
5、加载网络图片
1、创建RequestQueue同上面
2、创建ImageLoader
示例:
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCash());
其中自定义BitmapCash()类是继承ImageCache的实现类
3、自定义BitmapCash类继承ImageCache
BitmapCash:
public class BitmapCash implements ImageCache{
public LruCachecache;
//将缓存图片的大小设置为10M
public int max = 10*1024*1024;
public BitmapCash () {
cache = new LruCache(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
//这里会获取到图片
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
cache.put(url, bitmap);
}
}
4、//创建ImageListener
ImageListener listener =
//顶一个参数是加载图片的imageView控件
ImageLoader.getImageListener(imageView,
//第二个参数是默认图片 第三个是访问失败时加载图片
R.drawable.ic_launcher, R.drawable.ic_launcher);
5、获取图片。第一个参数是图片地址,第二个是ImageListener 然后使用loader.get(url, listener);来获取网络图片。
如果想指定图片的宽和高
也可以使用loader.get(url, listener, 200, 200);
有了以上的基础,相信大家对Volley网络访问有一定的了解了吧,接下来描述会简洁一点。
这是volley提供的一个自定义控件,具备imageview控件的所有功能,并自带加载网络图片的功能。
1、2步同上
3、步骤直接在xml布局文件使用该控件
4、使用findviewById()实例化控件
5、获取图片:
String url = "http://img1.imgtn.bdimg.com/it/u=2680373034,1460593141&fm=21&gp=0.jpg";
//设置默认图片
imageView.setDefaultImageResId(R.drawable.ic_launcher);
//设置访问失败的图片
imageView.setErrorImageResId(R.drawable.ic_launcher);
//开始获取。url为图片的地址。loader为
imageView.setImageUrl(url, loader);