帮助类

简单的封装OkGo

2018-01-31  本文已影响74人  根艮哏艮根

本文只是简单的将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

上一篇 下一篇

猜你喜欢

热点阅读