Volley 网络框架异步加载入门
2017-08-03 15:09
267 查看
开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;
而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
首先我们需要依赖Volley:
我们在build.gradle添加此依赖:
以上这种是Post请求带的参数是以普通字符串形式传递给后台的,下面有种后台接受Json字符串的请求方式,我们先添加一个依赖,便于我们转换Json格式:
以上这种形式是以后台接受Json格式参数为例,细心的小伙伴可能发现了JsonObjectRequest接收了5个参数,为什么是5个,第三个参数是我们转换的Json格式的参数,源码中有一句对第三个参数的判断:
总结:主要分析了两种POST请求的用法,具体根据后台定夺,如果后台需求的参数是普通的String,我们只需要用Map存储起来然后用StringBuilder拼接就行了,然后重写getBody(),return这个StringBuilder的字符串(记得转换为UTF-8的格式);如果后台需求的是Json格式那么我们就把Map转换一下,然后把这个转出的JSONObject当做第三个参数传入JsonObjectRequest请求就OK了。
一种是JsonObjectRequest,一种是StringRequest,可以根据POST请求的用法灵活使用。
而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷;抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request。另外,Volley在不同的线程上异步执行所有请求而避免了阻塞主线程。
首先我们需要依赖Volley:
我们在build.gradle添加此依赖:
compile 'com.mcxiaoke.volley:library:1.0.19'然后直接上一波带注释的代码:
// new 一个请求的队列 RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); /** * int method RESTFul风格 常用的有Request.Method.GET,Request.Method.POST,Request.Method.DELETE等方法,看接口需要 * String url 统一资源定位符(Uniform Resource Locator)说白了就是接口网址 * Listener<String> listener 请求成功回调的接口 * ErrorListener errorListener 请求失败回调的接口 */ StringRequest mStringRequest = new StringRequest(Request.Method.POST , "https://qa-api.zixuangu8.com/my-followings" , new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("devil", "成功" + response); } } , new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("devil", error.getMessage(), error); } }) { @Override public byte[] getBody() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("_token", "6be13c5e-d583-498c-a6fb-b7813bb2ea4f"); map.put("userId", "551aaa95-75c5-479b-a11c-5898a5cebb41"); StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : map.entrySet()) { sb.append(entry.getKey()); sb.append("="); sb.append(entry.getValue()); sb.append("&"); } try { return sb.substring(0, sb.length() - 1).toString().getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } }; //将请求添加在请求队列中 mQueue.add(mStringRequest);因为是异步加载,所以不需要另外开线程,可以在主线程直接调用。
以上这种是Post请求带的参数是以普通字符串形式传递给后台的,下面有种后台接受Json字符串的请求方式,我们先添加一个依赖,便于我们转换Json格式:
compile 'com.google.code.gson:gson:2.8.1'博主特意叫朋友给了个post请求后台接受参数为Json的接口(博主公司后台接受的就是普通的字符串,并不是Json格式的,当然此框架是为了更好的了解网络请求,现在的公司基本都是Retorfit + RxJava)下面上代码:
// 返回是Json Volley异步请求 Map<String, String> map = new HashMap<String, String>(); map.put("memberId", "93381e72855045609e2fbbdfb61ea23d"); JSONObject paramJsonObject = new JSONObject(map); // paramJsonObject:{"memberId":"93381e72855045609e2fbbdfb61ea23d"} // new 一个请求的队列 RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); /* int method RESTFul风格 常用的有Request.Method.GET,Request.Method.POST,Request.Method.DELETE等方法,看接口需要 * String url 统一资源定位符(Uniform Resource Locator)说白了就是接口网址 * J a1d4 SONObject jsonRequest 被封装成Json的请求体 * Listener<String> listener 请求成功回调的接口 * ErrorListener errorListener 请求失败回调的接口 */ JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.POST , "http://60.173.235.235:9898/ykds-admin/api/mall/getUserData" , paramJsonObject , new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("devil", "成功" + response); // 注意可以直接在加载UI并不需要重新调用UI线程,是不是特别方便 Toast.makeText(SecondActivity.this, "success", Toast.LENGTH_SHORT).show(); } } , new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("devil", error.getMessage(), error); } } ); Log.e("devil", "怪兽" + mJsonObjectRequest.toString()); mQueue.add(mJsonObjectRequest);
以上这种形式是以后台接受Json格式参数为例,细心的小伙伴可能发现了JsonObjectRequest接收了5个参数,为什么是5个,第三个参数是我们转换的Json格式的参数,源码中有一句对第三个参数的判断:
jsonRequest == null ? Method.GET : Method.POST我们可以发现当第三个参数为空时,底层默认调用了GET请求,最后我们贴一个最简单的GET请求的样式吧:
//创建请求队列返回是String RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext()); StringRequest mStringRequest = new StringRequest(Request.Method.GET, "https://qa-api.zixuangu8.com/my-favorite-communities?_token=88b08891-173f-4d6e-927d-278f0e23d2ea", new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("devil", b.getMsg()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("devil", error.getMessage(), error); } }); //将请求添加在请求队列中 mQueue.add(mStringRequest);
总结:主要分析了两种POST请求的用法,具体根据后台定夺,如果后台需求的参数是普通的String,我们只需要用Map存储起来然后用StringBuilder拼接就行了,然后重写getBody(),return这个StringBuilder的字符串(记得转换为UTF-8的格式);如果后台需求的是Json格式那么我们就把Map转换一下,然后把这个转出的JSONObject当做第三个参数传入JsonObjectRequest请求就OK了。
一种是JsonObjectRequest,一种是StringRequest,可以根据POST请求的用法灵活使用。
相关文章推荐
- 网络通信框架Volley之一——获取String数据和图片的异步加载
- Android:android的框架区别(网络框架、图片异步加载与缓存框架、数据框架)特点整理
- Android Volley入门到精通:使用Volley加载网络图片
- Android RxJava+Retrofit异步网络加载框架
- Android网络框架-Volley(三) 加载图片
- Android volley框架加载网络图片
- Goole官方网络框架-Volley的使用解析Json以及加载网络图片方法
- 使用Volley框架的ImageLoader加载网络图片
- 在Android Studio上使用GSON+VOLLEY,秒处理网络数据成集合。感受框架的力量。搭配RecyclerView和SwipeRefreshLayout,实现底端加载更多,下拉刷新。
- Android Volley入门到精通:使用Volley加载网络图片(示例,出错代码)
- 使用Volley框架的ImageLoader加载网络图片
- Android volley框架加载网络图片
- Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
- Android Volley入门到精通:使用Volley加载网络图片(示例,出错代码)
- Android volley框架加载网络图片
- Android异步网络请求开源框架Volley
- Android volley框架加载网络图片
- Android Volley入门到精通:使用Volley加载网络图片
- android网络开源框架volley(四)——谈谈图片加载
- 使用Volley框架异步加载图片+ListView图片加载错位解决