您的位置:首页 > 理论基础 > 计算机网络

网络编程--初识Volley之Request的使用

2016-05-02 19:49 603 查看
参考自/article/1562120.html

Volley简介

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

StringRequest的使用

首先我们可以新建一个工具类专门用于处理网络的请求

我们使用单例模式,将requestQueue单例,保证我们所有的request都在一个消息队列中进行处理

public class VolleyUtils {
private static VolleyUtils volleyUtils;
private static RequestQueue requestQueue;//消息队列
private ImageLoader imageLoader;//ImageLoader对象
private Context context;

private VolleyUtils(Context context) {
this.context=context;
requestQueue= Volley.newRequestQueue(context);
}
public  static synchronized  VolleyUtils newInstance(Context context){
if (requestQueue==null){
volleyUtils=new VolleyUtils(context);
}
return volleyUtils;
}

public RequestQueue getRequestQueue(){
if(requestQueue == null){
requestQueue = Volley.newRequestQueue(context.getApplicationContext());
}
return requestQueue;
}
//将网络请求添加到请求队列处理
public void addRequestQueue(Request request){
getRequestQueue().add(request);
}
}


接下来我们只需要在活动中发起相应的请求就可以了

StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("网络连接错误");
}
});
volleyUtils.addStringRequestQueue(stringRequest);


就可以获取到网页的源码了



上面我们使用的是GET,如果我们想要发送数据的话就需要使用POST方法了,

如果想要发出一条POST请求应该怎么做呢?StringRequest中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener);


可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};


JsonObjectRequest的使用

学完了最基本的StringRequest的用法,我们再来进阶学习一下JsonRequest的用法。类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

至于它们的用法也基本上没有什么特殊之处,先new出一个JsonObjectRequest对象,如下所示:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://apistore.baidu.com/microservice/cityinfo?cityname=%E5%8C%97%E4%BA%AC", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
textView.setText(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("ERROR");
}
});
VolleyUtils.newInstance(getApplicationContext()).addRequestQueue(jsonObjectRequest);


可以看到,这里我们填写的URL地址是http://apistore.baidu.com/microservice/cityinfo?cityname=%E5%8C%97%E4%BA%AC,这是百度天气api接口的一个数据,返回的数据是json格式的数据。



JsonArrayRequest的用法与此基本一样,这里就不再贴出代码。

ImageRequest的使用

ImageRequest是用来加载网络上的图片的Request,使用方法和上面的基本一致

ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。

ImageRequest imageRequest = new ImageRequest("http://bizhi.4493.com/uploads/allimg/140830/4-140S0141625.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
Toast.makeText(MainActivity.this, "SUCCESS", Toast.LENGTH_SHORT).show();
}
}, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, null,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.mipmap.ic_launcher);
Toast.makeText(MainActivity.this, "ERROR", Toast.LENGTH_SHORT).show();
}
});
VolleyUtils.newInstance(getApplicationContext()).addRequestQueue(imageRequest);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: