接上文,这次来说一下如何使用Volley,会给出一些范例,和原理
Volley使用 StringRequest
// 初始化一个请求队列,RequestQueue是volley库的类 RequestQueue queue = Volley.newRequestQueue(this); String url ="http://www.baidu.com"; //定义一个字符串型请求队列,需要传递4个参数分别是:url, 请求的方式(get, post..),响应成功的处理函数匿名对象, 相应出错时候的处理函数匿名对象 StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // Display the first 500 characters of the response string. mTextView.setText("Response is: "+ response.substring(0,500)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mTextView.setText("That didn‘t work!"); } }); //添加到请求队列中,默认就开始了网络请求 queue.add(stringRequest);
按照Volley的设计规则,程序要只要创建一个RequestQueue,并传递一个Request对象行了。RequestQueue维护这一些正在访问网络的线程的运行,读写缓存,获取网络请求的返回等事务。Request对象会再收到数据后进行解析,而RequestQueue还会负责将解析过的数据返回给主线程(UI线程),以便于你将数据在UI控件中展示等。
要使用Volley,必须在应用的Menifest文件中声明android.permission.INTERNET的权限。
Volley发送网络的过程解析
要想在代码中获取一个RequestQueue,默认可以使用Volley.newRequestQueue方法来完成,如上述代码所示。当然你也可以自己定义一个你自己的RequestQueue。从上面的代码看出,当Request对象创建好后,你只要调用RequestQueue的add()方法(参数就是Request对象)就能将这个网络请求发出。当add方法调用后,Volley会自动创建一个缓存处理线程和一个网络请求线程池,Volley会先判断你发送网络请求是否曾经存在于缓存中,若已经存在,那么缓存处理线程会对发出请求进行处理并返回结果(中间没有任何网络交互)。如果你发送的网络请求在缓存没有找到,那么这个请求会被放在网络请求队列中,网络请求线程池中会逐个从网络请求队列中获取请求内容,通过HTTP发生网络请求事务,返回的结果由Volley返回给主线程。
Volley取消网络请求操作
Volley库可以在代码中使用RequestQueue中的cancelAll()方法完成。比如,每个Request子类都有个setTag(Object obj)的方法,可以将每个tag设置为一类请求。比如你在一个Activity中的所有Request都用this(Activity的this就是该activity实例)作为setTag的参数,你可以随时随地调用RequestQueue的cancelAll(Object obj)方法,传递this作为obj的实参,这样这个activity的所有网络请求都被取消了。当然也可以传递任意的字符串类型的参数(最好有意义的字符串),代码实例:
public static final String TAG = "MyTag"; StringRequest stringRequest; // Assume this exists. RequestQueue mRequestQueue; // Assume this exists. // 给Request设置tag进行分来 stringRequest.setTag(TAG); mRequestQueue.add(stringRequest);
取消网络请求比较好的途径是放在activity的onStop方法中(也可以是任何地方,这里是惯例),如下
@Override protected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); } }
另外需要注意的是,Request的响应处理函数(Response.Listener和Response.ErrorListener,见上)此时不会被调用。
如何在Request中设置Htpp请求的Header, Body?
要想设置request中的http请求中的header, boday内容可以重载getHeader方法
StringRequest request = new StringRequest(Request.Method.POST, "www.yoururl.com", new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } }){ @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> map = new HashMap<>(); Map<String, String> params = new HashMap<String, String>(); params.put("User-Agent", "Nintendo Gameboy"); params.put("Accept-Language", "fr"); params.put("Authorization", "Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"); return params; } };
对你有用的话,就点个赞吧, :)