Android 网络请求框架(二) OkHttp封装

复制 参考某大佬写的,感谢大佬
build.gradle配置

    implementation 'com.squareup.okhttp3:okhttp:3.14.4'
    implementation 'com.squareup.okio:okio:1.17.2'
	implementation 'com.google.code.gson:gson:2.8.6'

AndroidManifest.xml添加网络权限

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

代码如下

public class GeRequestRry {

    private OkHttpClient client;
    private Request.Builder request;
    private FormBody.Builder requestBody;
    private Gson gson;
    private Class aClass;

    private Handler handler;

    private int connectTimeout = 15;
    private int readTimeout = 10;

    private RequestType type;

    private static GeRequestRry requestRry;

    public static GeRequestRry getInstance() {
        if (requestRry == null){
            synchronized (GeRequestRry.class){
                if (requestRry == null){
                    requestRry = new GeRequestRry();
                }
            }
        }
        return requestRry;
    }

    private GeRequestRry(){
        gson = new Gson();
        handler = new Handler();
        client = new OkHttpClient.Builder()
        	.connectTimeout(connectTimeout, TimeUnit.SECONDS)
            .readTimeout(readTimeout,TimeUnit.SECONDS)
            .build();
    }

    /**
     * 请求类型
     */
    public enum RequestType{
        GET,POST
    }

    /**
     * 请求类型
     * @param type
     * @return
     */
    public GeRequestRry create(RequestType type){
        if (type == RequestType.POST)
            requestBody = new FormBody.Builder();
        this.type = type;
        request = new Request.Builder();
        return this;
    }

    /**
     * 映射实体类
     * @param aClass
     * @return
     */
    public GeRequestRry setMapClass(Class aClass){
        this.aClass = aClass;
        return this;
    }

    /**
     * 请求Url
     * @param url
     * @return
     */
    public GeRequestRry url(String url){
        if (request == null){//不闪退一下都不知道自己哪错了
            throw new NullPointerException("请求为空 ==> 没写create方法");
        }
        request.url(url);
        return this;
    }

    /**
     * 添加参数
     * @param key
     * @param value
     * @return
     */
    public GeRequestRry add(String key, String value){
        requestBody.add(key,value);
        return this;
    }

    /**
     * 构建
     * @param result
     */
    public void build(OnResponse result){
        if (type == RequestType.GET){
            get(result);
        }else if (type == RequestType.POST){
            post(result);
        }
    }

    private void get(OnResponse result){
        client.newCall(request.get().build()).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                clear();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        result.fail(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                clear();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //可能发生实体类转换异常
                        try{
                            int code = response.code();
                            if (code == 200){
                                String data = response.body().string();
                                if (aClass != null){
                                    result.success(gson.fromJson(data,aClass));
                                }else {
                                    result.success(data);
                                }
                            }else {
                                result.fail(code);
                            }
                        }catch (Exception e){
                            result.fail(e);
                        }
                    }
                });
            }
        });
    }

    private void post(OnResponse result){
        client.newCall(request.post(requestBody.build()).build()).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                clear();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        result.fail(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                clear();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //可能发生实体类转换异常
                        try{
                            int code = response.code();
                            if (code == 200){
                                String data = response.body().string();
                                if (aClass != null){
                                    result.success(gson.fromJson(data,aClass));
                                }else {
                                    result.success(data);
                                }
                            }else {
                                result.fail(code);
                            }
                        }catch (Exception e){
                            result.fail(e);
                        }
                    }
                });
            }
        });
    }

    private void clear(){
        request = null;
        if (requestBody != null)
            requestBody = null;
    }

    public interface OnResponse<A>{
        void success(A a);
        void fail(Exception e);
        void fail(int code);
    }
}

GET请求如下

        GeRequestRry.getInstance().create(GeRequestRry.RequestType.GET)
                .url("https://www.xxx.com")
                //如果不想转换实体类就写String
                .build(new GeRequestRry.OnResponse<String>() {
                    @Override
                    public void success(String o) {
                        Log.e(TAG,o);
                    }

                    @Override
                    public void fail(Exception e) {
                        Log.e(TAG,e.getMessage());
                    }

                    @Override
                    public void fail(int code) {
                        Log.e(TAG,"Error code = "+code);
                    }
                });

POST请求如下

        GeRequestRry.getInstance().create(GeRequestRry.RequestType.POST)
                .url("https://www.xxxxxx.com/api")
                .add("key","value")//添加请求参数
                .setMapClass(KS.class)//设置要转化的实体类
                .build(new GeRequestRry.OnResponse<KS>() {
                    @Override
                    public void success(KS o) {
                        Log.d(TAG,o.getErrmsg());
                    }

                    @Override
                    public void fail(Exception e) {
                        Log.e(TAG,e.getMessage());
                    }

                    @Override
                    public void fail(int code) {
                        Log.e(TAG,"Error code = "+code);
                    }
                });

如需其他请求方式或其他功能请自行添加

2019.12.31 略微改动:回调方法运行在主线程 设置工具类为单例

发布了13 篇原创文章 · 获赞 2 · 访问量 1103

猜你喜欢

转载自blog.csdn.net/AneTist/article/details/103768151