Volley 网络框架异步加载入门

开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等;

而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)说白了就是接口网址
 * JSONObject 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请求的用法灵活使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值