Volley + OkHttp3 + Gson 组合的简单网络请求封装

1. Volley —— Google出品的android平台轻量级网络库

优点:扩展性强,请求队列管理

基本介绍:http://blog.csdn.net/itachi85/article/details/51043704

github镜像: https://github.com/mcxiaoke/android-volley

2. okhttp —— Square出品的java网络库,android4.4以后已作为默认的HTTP连接实现

优点:支持SPDY,连接池,传输效率的各种优化

基本介绍:http://blog.csdn.net/itachi85/article/details/51142486

源码:https://github.com/square/okhttp

官方wiki:https://github.com/square/okhttp/wiki

3. Volley + OkHttp 结合

由于 Volley 和 OKHttp 各有优缺点,Volley 不支持 HTTPS,而 OKHttp 支持 HTTPS。Volley的扩展性又非常强,因此我们可以将 Volley 和 OKHTTP结合使用。

4. 添加依赖

// Volley
compile 'com.android.volley:volley:1.0.0'
// okhttp
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
// gson
compile 'com.google.code.gson:gson:2.7'

5. AppConfig.java —— 全局Application的配置

package com.qianxingzhe.mynetwork.app;

import android.app.Application;

import com.android.volley.RequestQueue;
import com.qianxingzhe.mynetwork.network.RequestManager;

/**
 * Created by lunyi.yly on 16/9/5.
 */

public class AppConfig extends Application {

    private static AppConfig instance;

    @Override
    public void onCreate() {
        super.onCreate();

        initAppConfig();

        initNetWork();
    }

    private void initNetWork() {
        if (RequestManager.getRequestQueueNoThrowable() == null) {
            RequestManager.init(this);
        }
    }

    private void initAppConfig() {
        if (instance == null) {
            instance = this;
        }
    }

    public static Application getApp() {
        return instance;
    }

    public static RequestQueue requestQueue() {
        return RequestManager.getRequestQueue();
    }
}

6. OkHttpStack

package com.qianxingzhe.mynetwork.network;

import com.android.volley.toolbox.HurlStack;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import java.util.Arrays;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

import okhttp3.OkHttpClient;
import okhttp3.OkUrlFactory;

/**
 * Created by lunyi.yly on 16/9/5.
 */

public class OkHttpStack extends HurlStack {
    private final OkUrlFactory okUrlFactory;

    public OkHttpStack() {
        this(new OkUrlFactory(getUnsafeOkHttpClient()));
    }

    public OkHttpStack(OkUrlFactory okUrlFactory) {
        if (okUrlFactory == null) {
            throw new NullPointerException("Client must not be null.");
        }
        this.okUrlFactory = okUrlFactory;
    }

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
        return okUrlFactory.open(url);
    }

    /**
     * 支持HTTPS。按下面的注释进行
     *
     * @return
     */
    private static OkHttpClient getUnsafeOkHttpClient() {
        try {
            /**
             * 读取公钥证书内容
             * 首先要把你的https公钥证书通过浏览器或者其他方法导出,放进android资源目录assets下。
             * 然后AppConfig这个类是继承了Application的,android启动的时候会先执行它,getApp是一个单例模式的实现
             */

            // 配置HTTPS时需要打开下面的注释

            // InputStream inputStream = AppConfig.getApp().getAssets().open("https.cer");
            //
            // CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            //
            // KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            // keyStore.load(null);
            //
            // int index = 0;
            // String certificateAlias = Integer.toString(index++);
            // keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(inputStream));

            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
                    TrustManagerFactory.getDefaultAlgorithm());

            // 配置HTTPS时需要把下面的注释打开
            // trustManagerFactory.init(keyStore);

            // 配置HTTPS时需要把下面这句注释掉
            trustManagerFactory.init((KeyStore) null);

            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                throw new IllegalStateException("Unexpected default trust managers:"
                        + Arrays.toString(trustManagers));
            }
            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{trustManager}, null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient client = new OkHttpClient
                    .Builder()
                    .sslSocketFactory(sslSocketFactory, trustManager)
                    .build();
            return client;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

7. RequestManager

package com.qianxingzhe.mynetwork.network;

import android.content.Context;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by lunyi.yly on 16/9/5.
 */

public class RequestManager {

    private static RequestQueue mRequestQueue;

    private RequestManager() {
    }

    public static void init(Context context) {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(context, new OkHttpStack());
        }
    }

    /**
     * @return instance() of the queue
     * @throws IllegalStateException if init has not yet been called
     */
    public static RequestQueue getRequestQueue() {
        if (mRequestQueue != null) {
            return mRequestQueue;
        } else {
            throw new IllegalStateException("Not initialized");
        }
    }

    /**
     * @return instance() of the queue
     * @throws IllegalStateException if init has not yet been called
     */
    public static RequestQueue getRequestQueueNoThrowable() {
        return mRequestQueue;
    }

}

9. MyJsonObjectRequest

package com.qianxingzhe.mynetwork.network;

import android.util.Log;
import android.widget.Toast;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.qianxingzhe.mynetwork.BuildConfig;
import com.qianxingzhe.mynetwork.app.AppConfig;

import org.json.JSONObject;

import java.util.Map;

/**
 * Created by lunyi.yly on 16/9/6.
 */

public class MyJsonObjectRequest {

    /**
     * 请求类型。如: GET,POST等
     */
    private int method;

    /**
     * 请求的URL
     */
    private String url;

    /**
     * 请求的参数
     */
    private JSONObject requestParameter;

    /**
     * 请求成功的响应
     */
    private RequestNetWork requestNetWork;

    public MyJsonObjectRequest(int method, String url, Map<String, Object> parameter, RequestNetWork requestNetWork) {
        this.method = method;
        this.url = url;
        this.requestNetWork = requestNetWork;

        initRequestParameter(parameter);

        createJsonObjectRequest();
    }

    private void initRequestParameter(Map<String, Object> parameter) {
        if (parameter == null) {
            return;
        }

        this.requestParameter = new JSONObject(parameter);
    }

    private void createJsonObjectRequest() {
        JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(
                method,
                url,
                requestParameter,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        if (BuildConfig.DEBUG) {
                            Log.e("TAG", response.toString());
                        }

                        requestNetWork.onSuccess(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        if (BuildConfig.DEBUG) {
                            Log.e("TAG", error.getMessage(), error);
                        }

                        Toast.makeText(AppConfig.getApp(), "网络请求失败", Toast.LENGTH_SHORT).show();
                    }
                }
        );
        AppConfig.requestQueue().add(mJsonObjectRequest);
    }

    public interface RequestNetWork {
        void onSuccess(JSONObject response);
    }
}

10. 使用示例

MyJsonObjectRequest mRequest = new MyJsonObjectRequest(
                Request.Method.POST,
                "http://api.1-blog.com/biz/bizserver/article/list.do",
                null,
                new MyJsonObjectRequest.RequestNetWork() {
                    @Override
                    public void onSuccess(JSONObject response) {
                        Gson mGson = new Gson();
                        Article article = mGson.fromJson(response.toString(), Article.class);
                        Log.e("TAG", article.getDetail().get(0).getTitle());
                    }
                }
        );

11. AndroidManifest设置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.qianxingzhe.mynetwork">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name=".app.AppConfig"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
posted @ 2016-09-06 10:06  yly123  阅读(1246)  评论(0编辑  收藏  举报