简单的封装OkGo

本文只是简单的将OkGo封装了一下,如有什么没有考虑到的问题还请各位大神提出来,我们一起进步(ps:大神自动过滤,本文只适合小白)

OkGo地址 [https://github.com/jeasonlzy/okhttp-OkGo]
OkGo文档地址 [https://github.com/jeasonlzy/okhttp-OkGo/wiki]
OkHttpUtil地址 [https://github.com/hongyangAndroid/okhttputils](已停止维护)

原因:

在项目中需要从网络或者后台去获取数据的时候,我们就会去写一个网络请求方法(其中包括进度条展示,Gson转换等),久而久之,网络请求方法就遍布到我们系统的每个地方,假如后期维护的时候突然发现这个网络请求框架不好,需要去换一个的话,那就麻烦了,维护的程序员心中会有一万个草泥马奔腾而过吧!!!
根据上面说的,这样也确实是个问题,在做项目的时候为了方便就在需要的时候去写,这样确实会对以后的维护带来很多的不便,那么我们就本着造福人类(哈哈)的想法去封装一些通用的方法。

封装

封装很简单,直接上代码
JsonCallback.class

/**
 * 类名:com.lxg.http
 * 时间:2018/1/30 14:45
 * 描述:将返回过来的json字符串转换为实体类
 * 修改人:
 * 修改时间:
 * 修改备注:
 *
 * @author Liu_xg
 */
public abstract class JsonCallback<T> extends AbsCallback<T> {
    private Type mType;
    private Class<T> clazz;

    public JsonCallback() {
    }

    public JsonCallback(Type type) {
        mType = type;
    }

    public JsonCallback(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public T convertResponse(Response response) throws Throwable {

        ResponseBody body = response.body();
        if (body == null) {
            return null;
        }
        T data = null;
        Gson gson = new Gson();
        String str = response.body().string();
        if (mType != null) {
            data = gson.fromJson(str, mType);
        }
        if (clazz != null) {
            data = gson.fromJson(str, clazz);
            //可以将错误信息在onError中获取到
            //https://github.com/jeasonlzy/okhttp-OkGo/wiki/Callback#callback%E4%BB%8B%E7%BB%8D
        }
        return data;
    }
}

DialogCallback.class

/**
 * 类名:com.lxg.http
 * 时间:2018/1/30 14:34
 * 描述:网络请求前显示一个dialog,请求结束后取消loading
 * 修改人:
 * 修改时间:
 * 修改备注:
 *
 * @author Liu_xg
 */

public abstract class DialogCallback<T> extends JsonCallback<T> {

    private ProgressDialog mProgressDialog;

    public DialogCallback(Activity activity,Class<T> tClass) {
        super(tClass);
        initDialog(activity);
    }


    private void initDialog(Activity activity) {
        mProgressDialog = new ProgressDialog(activity);
        mProgressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgressDialog.setMessage("网络请求中");
    }

    @Override
    public void onStart(Request<T, ? extends Request> request) {
        if (mProgressDialog != null && !mProgressDialog.isShowing()) {
            mProgressDialog.show();
        }

    }

    @Override
    public void onFinish() {
        if (mProgressDialog != null && mProgressDialog.isShowing()) {
            mProgressDialog.dismiss();
        }
    }

    @Override
    public void onSuccess(Response<T> response) {

    }
}

以上是两个基类,是将json字符串转换为实体类和在每个请求前面添加进度条的方法抽取出来,弄成一个基类,这样就不需要在每次请求的时候又去单独写了。

为了方便调用,我们采用建造者模式(Builder)的方式来封装我们自己的请求类

OkGoBuilder.class

/**
 * 类名:com.lxg.http
 * 时间:2018/1/31 9:18
 * 描述:okgo帮助类-建造者模式
 * 修改人:
 * 修改时间:
 * 修改备注:
 *
 * @author Liu_xg
 */

public class OkGoBuilder<T> {
    /**
     * get请求
     */
    public static final int GET = 1;
    /**
     * post请求
     */
    public static final int PSOT = 2;


    private Activity activity;
    /**
     * 请求网址
     */
    private String url;
    /**
     * 参数
     */
    private HttpParams params;
    /**
     * 实体类
     */
    private Class<T> clazz;
    /**
     * 回调
     */
    private Callback<T> callback;

    private int methodType;

    /**
     * 单列模式
     **/
    private static OkGoBuilder mOkGoBuilder = null;

    /**
     * 构造函数私有化
     **/
    private OkGoBuilder() {
    }

    /**
     * 公有的静态函数,对外暴露获取单例对象的接口
     **/
    public static OkGoBuilder getInstance() {
        if (mOkGoBuilder == null) {
            synchronized (OkGoBuilder.class) {
                if (mOkGoBuilder == null) {
                    mOkGoBuilder = new OkGoBuilder();
                }
            }
        }
        return mOkGoBuilder;
    }


    public OkGoBuilder Builder(Activity activity) {
        this.activity = activity;
        return this;
    }

    public OkGoBuilder url(String url) {
        this.url = url;
        return this;
    }

    public OkGoBuilder method(int methodType) {
        this.methodType = methodType;
        return this;
    }

    public OkGoBuilder params(HttpParams params) {
        this.params = params;
        return this;
    }

    public OkGoBuilder cls(Class<T> clazz) {
        this.clazz = clazz;
        return this;
    }

    public OkGoBuilder callback(Callback<T> callback) {
        this.callback = callback;
        return this;
    }


    public OkGoBuilder build() {
        if (methodType == 1) {
            getRequest();
        } else {
            postRequest();
        }
        return this;
    }

    /**
     * post请求
     */
    private void postRequest() {
        OkGo
                // 请求方式和请求url
                .<T>post(url)
                .params(params)
                // 请求的 tag, 主要用于取消对应的请求
                .tag(this)
                // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
                .cacheKey("cacheKey")
                // 缓存模式,详细请看缓存介绍
                .cacheMode(CacheMode.DEFAULT)
                .execute(new DialogCallback<T>(activity, clazz) {
                    @Override
                    public void onSuccess(Response<T> response) {
                        callback.onSuccess(response.body(), 1);
                    }

                    @Override
                    public void onError(Response<T> response) {
                        super.onError(response);
                        Throwable throwable = response.getException();
                        if (throwable != null) {
                            throwable.printStackTrace();
                            callback.onError(throwable, 2);
                        }
                    }

                });
    }

    /**
     * get请求
     */
    private void getRequest() {
        OkGo
                // 请求方式和请求url
                .<T>get(url)
                .params(params)
                // 请求的 tag, 主要用于取消对应的请求
                .tag(this)
                // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
                .cacheKey("cacheKey")
                // 缓存模式,详细请看缓存介绍
                .cacheMode(CacheMode.DEFAULT)
                .execute(new DialogCallback<T>(activity, clazz) {
                    @Override
                    public void onSuccess(Response<T> response) {
                        callback.onSuccess(response.body(), 1);
                    }

                    @Override
                    public void onError(Response<T> response) {
                        super.onError(response);
                        Throwable throwable = response.getException();
                        if (throwable != null) {
                            throwable.printStackTrace();
                            callback.onError(throwable, 2);
                        }
                    }

                });
    }


}

这样写了之后,通过泛型,使每个网络请求都使用它,就是把它作为了网络请求公共入口类,那么我们在后期维护的时候只需要去修改这里面的代码即可,是不是感觉很方便啊。

使用方法

        HttpParams paramsPost = new HttpParams();
        paramsPost.put("sort", "desc");
        paramsPost.put("page", "1");
        paramsPost.put("pagesize", "5");
        paramsPost.put("time", "1514736923");

        OkGoBuilder.getInstance()
                .Builder(this)
                .url(URL)
                .method(OkGoBuilder.PSOT)
                .params(paramsPost)
                .cls(HttpDataBean.class)
                .callback(new Callback<HttpDataBean>() {
                    @Override
                    public void onSuccess(HttpDataBean response, int id) {
                        Log.i(TAG, "onSuccess1: " + response.getReason());
                    }

                    @Override
                    public void onError(Throwable e, int id) {

                    }
                })
                .build();

项目我已经上传到Github上面了:https://github.com/liuxinggen/OkGoUtils

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,476评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,982评论 19 139
  • 最近读了一本小说~《佛兰德斯的狗》,初次读这本小说,很感动。几次落泪。 小说讲了一个贫穷的小男孩和他忠心的爱狗之间...
    玉儿梵蒂冈阅读 3,811评论 0 1
  • 这本《逻辑说话术》,作者把自己平时说话的思路和方法,很详细的把其中的要点和技巧分享给我们了。我摘抄其中一部分,便于...
    徐薇薇阅读 1,016评论 0 5
  • 情诗两三首 五月是个浪漫情怀的季节,尤其是这样一个细雨霏霏的早晨,更让人诗意...
    bai素心若雪阅读 1,015评论 1 1