美文网首页移动开发Android技术知识Android开发
1. Http请求模块,Volley+OkHttp。(获取数据,

1. Http请求模块,Volley+OkHttp。(获取数据,

作者: Tony_HQ | 来源:发表于2016-10-15 19:32 被阅读0次

    概述步骤

    a. 添加Volley库,并封装Volley为单例模式。

    b. 使用OkHttp实现 基于 com.android.volley.toolbox.HttpStack 这个借口的OkHttpStack。

    c. 其中使用 com.franmontiel.persistentcookiejar 实现本地持久化Cookies。

    d. 因为使用Aliyun OSS 作为图片服务器,所以需要用到 Multipart Request (Volley 没有提供) 所以 继承 com.android.volley.Request 实现Multipart Request。

    e.Request Samples.

    顺序从B->C->A->D这个顺序

    Part B 实现OkHttpStack

    先引用一段代码->Github完整代码-> OkHttpStack.java

    Part C 本地Cookies持久化部分

    精选部分OkHttpStack.java代码,添加本地Cookies持久化部分,这里涉及到一个开源库-PersistentCookieJar(自己封装一个也很简单,参考这个开源库即可,也可用Sqlite来实现,只要显现了ClearableCookieJar的接口即可)

    ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(mContext));
    
    OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
    builder.connectTimeout(timeoutMs, TimeUnit.MILLISECONDS)
           .readTimeout(timeoutMs, TimeUnit.MILLISECONDS)
           .writeTimeout(timeoutMs,TimeUnit.MILLISECONDS).cookieJar(cookieJar);
    

    也没有太多可以赘述的地方。

    Part A 添加Volley库+ 实现Volley 单例模式

    下载Volley,然后用Android Studio 添加Module (Google 一下,无须赘述)
    接着在build.gradle module 级别里添加
    compile project(":volley")
    setting.gradle 里 添加(修改成) app是博主module的名字,关键是吧:volley 添加进去
    include ':app', ':volley'

    接下来实现Volley的单例模式(Java Singleton)
    MyVolleySingleton.java
    抽出部分来说
    里面有个ImageLoader部分,如果使用Picasso可以忽略这个部分。

    Part D 封装Multipart Request

    博主参考了一个封装,修改了body部分
    MultipartRequest.java

    大体至此,Http请求模块的配置就结束了,最后用一个Sample结尾。
    博主这里是把StringRequest 封装成了静态函数,因为使用RestFul Server,因此需要用METHOD.PUT。 接着使用Fastjson转化Object 到JSON。

            MyVolleySingleton.getInstance(getBaseContext()).addToRequestQueue(
                   RequestPutFactory.putAtv(com.alibaba.fastjson.JSON.toJSONString(putAtvModel), new RequestCallback() {
                        @Override
                        public void successCallback(String response) {
                            action_publish.setText("创建完成");
                            Atv atv=com.alibaba.fastjson.JSON.parseObject(response,Atv.class);
                            Intent newIntent=new Intent(getBaseContext(),ScrollingAtvActivity.class);
                            newIntent.putExtra("activity_id",atv.getActivity_id());
                            startActivity(newIntent);
                        }
                        @Override
                        public void failCallback(VolleyError error){
    
                        }
    
                        @Override
                        public void processCallback() {
    
                        }
                    })
            );
    

    下面是对RequestPutFactory的摘要。

    public static StringRequest putAtv(final String json, final RequestCallback reqCallback){
            return putRequestGenerater("/atv",json,reqCallback);
        }
    

    函数putRequestGenerater全部代码。

    public static StringRequest putRequestGenerater(final String url_part,final String json, final RequestCallback reqCallback){
            StringRequest stringRequest =new StringRequest(Request.Method.PUT,end_point+url_part, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    reqCallback.successCallback(response);
                }
            },new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    error.printStackTrace();
                    reqCallback.failCallback(error);
                }
            }){
                @Override
                public byte[] getBody() throws AuthFailureError{
                    try {
                        return json.getBytes("UTF-8");
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        return null;
                    }
                }
                @Override
                public String getBodyContentType() {
                    return "application/json; charset=" + getParamsEncoding();
                }
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String,String> params = new HashMap<String, String>();
                    params.put("Content-Type","application/json");
                    return params;
                }
            };
            return stringRequest;
        }
    

    到此基本上对于Android与服务器进行交互问题就不大了。
    图片上传问题后面再谈。

    相关文章

      网友评论

        本文标题:1. Http请求模块,Volley+OkHttp。(获取数据,

        本文链接:https://www.haomeiwen.com/subject/pncoyttx.html