一、前期基础知识储备
库最有价值的地方在于可逆:你将库添加到你的应用程序中,之后也可以将其删除(没有任何开销)。随时都能拿出来。不是所有的东西都可以这样,但如果它可以的话,请把它做成一个库,而不是和你的应用终生绑在一起。选择正确的库意味着你可以拥有一个已经成熟的更好的解决方案,而不是花费三个月来重新构建它。了解这些库是第一步。笔者会在第三方库做一个系列讲解,为著名的库,写写传记。
本节开始谷歌推出的网络通讯库——Volley。
(1)Volley是什么?首先,我们来看一看谷歌官方给出的Volley的描述图:
Volley,2013年谷歌I/O大会上发布的Android平台上的网络通信库,其非常适合用在“迸发、效率、性能”要求非常高的场景,即网络通信频繁的、数据量小的传输。
(2)Volley的特点:
①通信更快、更简单
②Get、Post网络请求及网络图像的高效率异步处理请求
③网络请求排序优先级处理
④网络请求的缓存(网络不好时)
⑤多级别取消请求(一次性取消所有请求)
⑥和Activity生命周期的联动(随Activity一起停止,避免在后台运行)
(3)为什么选择Volley?
①功能上:
1)高效的Get/Post方式的数据请求交互(自己写有很多问题!);
2)网络图片的加载和缓存。(不用Volley,自己写非常容易造成内存溢出的问题。因为可以做到缓存,所以可以节省用户的流量,而且APP本身的流畅性和性能非常稳定)。
②其他方面:
1)谷歌官方推出,所以优化和维护都做的非常好;
2)性能稳定,效率强劲。
(4)Volley的局限:不适合于文件的上传和下载,涉及到大文件的上传和下载时请考虑别的网络通讯库,比如xUtils或者另一个大名鼎鼎的库Retrofit。
(对于Retrofit 和 Volley 来说,你经常会看到些比较,你会看到 Volley 比 Retrofit 做的更多(例如图像下载和 neat ))。
二、上代码,具体实现
AndroidStudio中添加依赖
点开build.gradle,添加下面的代码到dependencies,在你的Gradle文件中添加:
compile'com.mcxiaoke.volley:library:1.0.+' ,随后Android Studio会自动添加好。
(1)Volley的请求的数据对象
Volley对Android原生的get/post请求方式做一个的封装,优化了请求的效率
在使用时需要挑选合适的返回对象。使用Volley,我们可以从网络请求常见的三种数据:①String类型;②JSON类型;③图片类型。对应的处理对象为:
1)StringRequest——我们对返回数据类型不确认的时候使用(涵盖后面两种)
2)JsonObjectRequset——确认对象为JsonObject
3)JsonArrayRequest——确认对象为JsonArray
4)ImageRequest——确认对象为图片,继承自Request,不建议使用
5)ImageLoader——确认对象为图片,不继承Request,可以缓存 更加高效
(2)Volley的一般用法
使用时,我们会建立一个全局的请求队列创建一个RequestQueue对象
然后建立我们的请求StringRequest对象,
加入到请求队列mQueue.add(stringRequest)中。
前4种Volley处理的对象都可以分为这三步实现,ImageLoader除外。
整个APP的请求是通过请求队列来进行管理的,这样方便我们取消某个/所有请求。
——————————————————我是代码分隔线————————————————————
下面以StringRequest对象为例,展示如何使用Volley从网络请求一段数据。
①AndroidManifest.xml文件请求网络权限
<uses-permission android:name="android.permission.INTERNET" />
②主Activity代码段
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textview);
RequestQueue mQueue = Volley.newRequestQueue(this);
String url = "http://www.google.cn/";//这里输入的网址为谷歌网址
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response);
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(stringRequest);
}
}
我们new出了一个StringRequest对象,StringRequest的构造函数有2种,这里我们使用的是第一种,默认的网络请求方式为GET,需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是谷歌的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。
注:以下为StringRequest的构造函数的构造情况
public StringRequest(int method, String url, Listener<String> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
③在使用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和JsonArrayRequest,使用起来,均和StringRequest的使用方法类似。只要把创建的对象改为其他两种即可,创建对象的方法,和加入队列的方法保持不变。
好了,关于Volley的基本用法就讲到这里,下篇文章中我会带领大家继续探究Volley。感兴趣的朋友请继续阅读《网络通讯库Volley精炼详解第(二)课:使用Volley加载网络图片》。