Volley网络访问框架是去年I/O大会正式推出的,自然在安卓系统架构中也是会得到很大的支持的,它内部创建线程池,往请求队列中添加请求对象,然后由内部线程池分配线程来执行任务,它适合做请求次数多,数据量较小的情景下使用,如果数据量太大将会非常影响体验,在下面我们将通过一个Listview加载网络图片的例子来介绍它,在介绍它之前,我们先来了解一下他的两种访问方法:最常见的GET和POST。
1.Volley使用GET方法请求服务端:
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());//创建请求队列
StringRequest request = new StringRequest(Method.GET,
"http://172.16.10.18:8080/Servlet/index.jsp?hello=hello",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this, response.trim(),
Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,
error.getMessage(), Toast.LENGTH_SHORT)
.show();
}
});
queue.add(request);
queue.start();
StringRequest构造方法传入访问方式(Method.GET) ,URL地址,后面就是两个回调接口,分别在请求成功和失败的时候调用。创建完成以后就加入到queue队列中,调用start方法发出请求访问。这个queue里面是可以存放多条请求的,然后在调用start的时候一条条的去执行。
2.Volley使用POST方法请求服务端:这个就有点隐蔽了,并不像前面的GET一样可以直接调用。
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());//创建请求队列
StringRequest request = new StringRequest(Method.POST,
"http://172.16.10.18:8080/Servlet/index.jsp", sucListener,
failListener) {
@Override
protected Map<String, String> getParams()
throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("hello", "hello");
return params;
}
};
queue.add(request);
queue.start();
这个是创建request方法里面的sucListener,failListener是实现了相应接口的两个类,处理跟之前的GET使用了相同的方式。这里主要的不同是在url里面只传了服务器地址,没有传参数,参数是在StringRequest里面的重写了父类方法,因为在创建request的时候调用post方法的话,执行请求的时候,请求队列会去拿这个方法返回的值作为参数。
了解上面的GET和POST方法之后,我们来创建这个使用Volley加载图片的Demo吧。
图片的加载主要就是adapter的编写了。
public MyAdapter(Context context, List<String> list) {
this.list = list;
this.context = context;
queue = App.getRequestQueue();
width = context.getResources().getDimensionPixelSize(
R.dimen.list_item_image_height);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(
R.layout.list_item, null);
holder.itemImage = (ImageView) convertView
.findViewById(R.id.item_image);
holder.itemTxt = (TextView) convertView
.findViewById(R.id.item_text);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
final ImageView imageView = holder.itemImage;
holder.itemTxt.setText(list.get(position));
imageRequest = new ImageRequest(list.get(position),
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, width, width, Config.ARGB_8888, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setBackgroundResource(R.drawable.ic_launcher);
}
});
queue.add(imageRequest);
queue.start();
return convertView;
}