奉天承运,领导召曰:你们几个实习生把Volley的实用方法都学透一点。so,我又重新看了一遍volley,原来就是潦草的看看怎么用就行了,这次一定要深入学习一下。
我是跟着郭霖大佬的帖子学的,这里就是做做笔记加自己的理解,不喜勿喷。
郭霖大佬的文章:
Android Volley完全解析(一),初识Volley的基本用法
进入正题:
一、Volley简介
主要内容就是Volley封装了各种网络请求,我们只需要调用一些简单的方法就能实现网络通信。volley比较适合进行数据量不大,通信频繁的网络操作,对于大数据量的网络操作性能不佳,比如文件下载(划重点,这里会出一道送命题!)
二、下载Volley
很尴尬,郭霖大神的下载需要8个积分,我很穷下载不起,只好另辟蹊径,在别的项目里面拷了一个出来(是不是很机智),其实我也在网上下载了一个不过没用过,看里面的文件是差不多的,我就都放在网上可以下载使用一下。
获取jar包有三种方式:
1.网上下载,可以百度一波,如果分多可以在csdn上直接下载,或者从我这下载需要两积分,我也想设置零积分,可是没有这个选项啊。
(没上传成功。。。放一个郭霖大神的下载链接)
2.可以到我的项目里面直接拷出来用,简单粗暴
项目里面有这个包,自行获取
3.clone官方的项目自己导出jar包,具体方法自行百度
三、StringRequest
使用三步走:
1.创建一个RequestQueue请求队列
2.创建一个StringRequest对象
3.将request对象添加到队列中
上代码:
第一步:创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
根据郭霖大佬说的,这个队列可以缓存所有的HTTP请求,而且非常适合高并发(我也不知道咋设计的,想知道的话再查吧),我们只需要在Activity中创建一个队列就可以了。
第二部:创建请求对象
StringRequest stringRequest = new StringRequest("https://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
textView.setText(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(this.toString(), "onErrorResponse: ",volleyError );
}
});
没错,这步我们获得的是一个request对象,需要传入三个参数第一个是url地址,第二个是响应成功的回调监听,第三个是响应失败的回调监听。
第三步:
将request对象添加到队列中
requestQueue.add(stringRequest);
至此,我们的字符串的请求就完成了,可谓是相当简单。
运行结果图:
StringRequest构造方法方法有两个:
public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) {
super(method, url, errorListener);
this.mListener = listener;
}
public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
this(0, url, listener, errorListener);
}
显然,我们实现的的是第二个构造方法,他是默认以get方式做请求的,如果我们想通过post方式做交互的话,就需要第一个构造方法了,就像这样:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
Method.POST就是指定请求方式为Post。
以下这段是抄写的,因为现在也不怎么用POST了,而且我也不知道去哪请求post类型的,就先不研究了所以也没写代码实现。
可是这只是指定了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;
}
};
JsonRequest
JsonRequest是个抽象类,所以我们用的时候用的都是它的子类,JsonObjectRequest和JsonArrayRequest,一个是用来请求jsonobject字段的,一个是用来请求json数组的。
具体使用方法呢也跟StringRequest差不多,也是三步走,在这我就先放个JsonObjectRequest的代码了。
第一步:创建队列(同上)
第二步:创建一个JsonObjectRequest对象,参数为url,jsonobject(post时添加参数),响应成功回调监听,响应失败回调监听
sonObjectRequest jsonRequest=new JsonObjectRequest("http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/1", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
textView.setText(jsonObject.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(this.toString(), "onErrorResponse: ",volleyError );
}
});
第三步:
将request对象添加到队列中
requestQueue.add(stringRequest);
未完待续。。。