Volley概述
Volley的简介
Volley是Android平台上的网络通信库,适用于属于数据量不大,但网络通信频繁的应用。但不适合数据的上传和下载。Volley的特点
通信更快,更简单
Get、Post网络请求及网络图像的高效率异步处理请求
对网络请求进行排序
网络请求的缓存
多级别取消请求
和Activity生命周期的联动为什么使用Volley
高效的Get\Post方式的数据请求交互
网络图片加载和缓存(不使用Volley的情况下,进行网络图片的处理会非常麻烦,非常容易内存溢出。)
谷歌官方推出
性能上很稳定
在Android Studio中进行配置
1.在gradle中添加依赖,如下
compile 'com.mcxiaoke.volley:library:1.0.19'
然后Build->Make Project,Android Studio就会自动下载有关volley的类库。
2.因为得进行联网的操作,所以还得添加联网的权限
在AndroidManifest.xml中加上如下权限
<uses-permission android:name="android.permission.INTERNET"/>
使用StringRequest
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.创建一个RequestQueue对象
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
//2. 创建一个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("ERROR",error.getMessage(),error);
}
});
//3. 将StringRequest对象添加到RequestQueue里面。
queue.add(stringRequest);
}
}
HTTP的请求类型通常有两种,GET和POST,上述代码使用的是一个GET请求。
使用JsonRequest
JsonRequest是一个抽象类,它有两个直接的子类,JsonObjectRequest和JsonArrayRequest,前者一段JSON数据,后者用于请求一段JSON数组。
下面的代码是关于JsonObjectRequest的使用。
public class MainActivity extends AppCompatActivity {
private ImageView iv_picture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_picture = (ImageView) findViewById(R.id.iv_picture);
//1. 创建一个RequestQueue对象
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
//2. 创建一个JsonObjectRequest对象
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.weather.com.cn/data/cityinfo/101010100.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//此处可以进行json解析
Log.d("TAG",response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("ERROR",error.getMessage(),error);
}
});
//3. 将jsonObjectRequest对象添加到RequestQueue里面。
queue.add(jsonObjectRequest);
}
由上述代码可知,JsonObjectRequest和StringRequest的用法基本上是完全一样的,JsonArrayRequest亦然。
使用ImageRequest
ImageRequest则是用于请求网络上的一张图片
public class MainActivity extends AppCompatActivity {
private ImageView iv_picture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_picture = (ImageView) findViewById(R.id.iv_picture);
//1. 创建一个RequestQueue对象
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
//2. 创建一个ImageRequest对象
//第一个参数就是图片的URL地址
//第三第四个参数分别用于指定允许图片最大的宽度和高度,
// 如果指定的网络图片的宽度或高度大于这里的最大值,
// 则会对图片进行压缩,指定成0的话就表示不管图片有多大,
// 都不会进行压缩。第五个参数用于指定图片的颜色属性,
// Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,
// 每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。
//第六个参数是图片请求失败的回调
ImageRequest imageRequest = new ImageRequest("http://pic8.nipic.com/20100725/2928847_183140012198_2.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iv_picture.setImageBitmap(response);
}
}, 1024, 570, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
iv_picture.setImageResource(R.mipmap.ic_launcher);
}
});
//3. 将ImageRequest对象添加到RequestQueue里面
queue.add(imageRequest);
}
运行结果如下:
使用ImageLoader
ImageLoader也可以用于加载网络上的图片,它的内部是使用ImageRequest来实现的,而且ImageLoader要比ImageRequest更加高效,它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
ImageLoader已经不是继承自Request的了,所以它的用法也和上述的例子有些不同。
public class MainActivity extends AppCompatActivity {
private ImageView iv_picture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_picture = (ImageView) findViewById(R.id.iv_picture);
}
public void getImageView(View view){
//1. 创建一个RequestQueue对象
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
//2. 创建一个ImageLoader对象
ImageLoader imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
// 3. 获取一个ImageListener对象
//getImageListener()的第一个参数指定用于显示图片的ImageView控件,
// 第二个参数指定加载图片的过程中显示的图片,
// 第三个参数指定加载图片失败的情况下显示的图片
ImageLoader.ImageListener listener = imageLoader.getImageListener(iv_picture,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
//4. 调用ImageLoader的get()方法加载网络上的图片
imageLoader.get("http://img3.redocn.com/tupian/20151023/huaduotexie_5165818.jpg",listener,1000,593);
}
}
运行结果如下:
(未完待续)