记一次对OkGo的封装

我司项目的接口最近放开了几个,准备开始网络请求数据。本来想用Retrofit + Rxjava 的,自己尝试的封装了一下,一般般(其实是我菜,哭!)。于是乎去网上找了找有什么封装比较好的第三方,转了一圈没有什么满意的,转而其次使用OkGo,目前GitHub上面有5K+的星,还是不错的。

基本上所有功能,包括网络请求都需要进行一次二次封装,以便于以后的维护更迭,所以自己准备对OkGo进行一下封装。(我才不会说我是网上找了一下,没有找到合适的!!!网上都是的说OkGo哪里好,或者基本使用方法,好一点的提供简单的封装一下,但是根本不适合在项目中使用。)

在与我司另外一位Android程序猿合力下终于封装好了,下面记录一下思路及实现。

自己简单写的封装,要改进的很多。先这样吧!有更好的方法请联系我。

1.建立一个类,专门用来保存api,同时根据api的code,获取对应的get/post/put/delete请求。

/**
 * 存放所有的API
 */

public class Urls {

    //网络请求返回码
    public static final int REUSLT_CODE_SUCCESS = 200;//成功

    //版本号
    public static int VERSION = 1;


    //APICode:用于识别是那个地址的
    public static final int GET_SMS_CODE = 0;//获取验证码
    public static final int LOGIN_CODE = 1;//登录
    //这里不列举了,以此类推


    //APIUrl:具体地址
    public static final String BASE_URL = "https:/xxxxx" + VERSION;
    public static final String SMS_URL = BASE_URL + "/user/sms";//验证码
    public static final String LOGIN_URL = BASE_URL + "/user/login";//登录
    

    /**
     * 根据APICode来获取对应的请求方式:
     * GET:0  POST:1  PUT:2  DELETE:3  错误:-1
     *
     * @param APICode
     * @return
     */
    public static int getOrPost(int APICode) {
        int code = -1;
        switch (APICode) {

            case HOME_CODE://查询首页数据
                code = 0;
                break;
            case GET_SMS_CODE://获取验证码
            case LOGIN_CODE://登录
                code = 1;
                break;
            case SHOP_CART_CHANGE_DATA_CODE://修改购物车数据
                code = 2;
                break;
            case SHOP_CART_DEL_DATA_CODE://删除购物车数据
                code = 3;
                break;
        }

        return code;
    }

2.建立一个接口,用来请求数据成功、失败、错误的回调,就3个方法,这里就不写了。

3.建立一个转换器,用来讲获取的String的json数据转换为bean对象,(okgo文档里面有,我这里也列出来了,泛型用的贼垃圾,有大神改进的话联系我嘿嘿)

/**
 * 用于将json数据转换为Bean对象
 */

public class JsonConvert<T> implements Converter<T> {

    private Type type;
    private Class clazz;

    public JsonConvert(Type type) {
        this.type = type;
    }

    public JsonConvert(Class t) {
        this.clazz = t;
    }

    public JsonConvert() {

    }

    /**
     * 该方法是子线程处理,不能做ui相关的工作
     * 主要作用是解析网络返回的 response 对象,生成onSuccess回调中需要的数据对象
     */
    @Override
    public T convertResponse(Response response) throws Throwable {

        ResponseBody body = response.body();
        if (body == null) return null;

        T data = null;
        Gson gson = new Gson();
        JsonReader jsonReader = new JsonReader(body.charStream());
        if (type != null) data = gson.fromJson(jsonReader, type);
        if (clazz != null) data = gson.fromJson(jsonReader, clazz);
        return data;
    }


}

4.建立一个工具类,进行请求方法设置。

public class HttpUtils<T> {

//这里对应4种请求方式。
public static final int GET = 0;
public static final int POST = 1;
public static final int PUT = 2;
public static final int DEL = 3;

/**
 * get请求:返回Observable
 */
public Observable<T> getObservable(String url, Map<String, String> paramerMap, Class c) {
        return OkGo.<T>get(url)
                .headers("xxx", xxx)
                .converter(new JsonConvert<T>(c))
                .adapt(new ObservableBody<T>());
}

/**
 * post请求:返回Observable
 */
public Observable<T> postObservable(String url, Map<String, String> paramerMap, Class c) {

        return OkGo.<T>post(url)
                 .headers("xxx", xxx)
                .params(paramerMap)
                .converter(new JsonConvert<T>(c))
                .adapt(new ObservableBody<T>());
}

//put和del请求同理

/**
 * 请求数据
 */
public void getBeanData(final int urlCode, String url, int requestCode, Map<String, String> map, Class c, final OnConnectionListener listener) {

    Observer observer = new Observer() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
        }

        @Override
        public void onNext(@NonNull Object o) {
            这里的listener就是第二步建立的接口
            listener.onResponse(urlCode, o);
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Logger.e("连接失败========" + e.toString());
            listener.onError(urlCode);
        }

        @Override
        public void onComplete() {
        }
    };

    if (requestCode == GET) {
        //get请求
        getObservable(url, map, c)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(@NonNull Disposable disposable) throws Exception {
                      
                        listener.onPreConnect(urlCode);
                    }
                })
                .subscribe(observer);


    } else if (requestCode == POST) {
        //post请求
        postObservable(url, map, c)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(@NonNull Disposable disposable) throws Exception {
                        listener.onPreConnect(urlCode);
                    }
                })
                .subscribe(observer);

    }

}

}

5.在model完成请求的相关监听

public class Model extends BaseModel implements OnConnectionListener {

    private final Context mContext;
    private final HttpUtils httpUtils;

    public Model (Context context) {
        this.mContext = context;
        httpUtils = new HttpUtils();
    }

 
     * 获取首页的数据
     */
    public Model getHomeData() {

        //进行联网
        Map<String, String> map = new HashMap<>();
        httpUtils.getBeanData(Urls.HOME_CODE, Urls.HOME_URL, Urls.getOrPost(Urls.HOME_CODE), map,HomeBean.class, this);

        return this;
    }


    /**
     * 对请求的回调: 请求之前
     *
     * @param responseCode
     */
    @Override
    public void onPreConnect(int responseCode) {
        
    }

    //请求成功
    @Override
    public void onResponse(int responseCode, Object o) {

        switch (responseCode) {
            case Urls.HOME_CODE://首页数据
               HomeBean homeBean = (HomeBean) o;
                int code = homeBean.getCode();
                if (code == 200) {
                    mOnRequestListener.onSuccessed(responseCode, o);
                } else {
                    String message = homeBean.getMessage();
                    mOnRequestListener.onFailed(responseCode, message);
                }
                break;
        }
    }


    //请求失败
    @Override
    public void onError(int responseCode) {
 
    }


    /**
     * 联网请求数据之后的接口回调
     */
    private OnRequestListener mOnRequestListener;

    public void setOnRequestListener(OnRequestListener listener) {
        this.mOnRequestListener = listener;
    }

}


6.具体请求

直接在代码中,model.getHomeData().setOnRequestListener(this);然后实现接口,就会有数据回调。

其实有很多地方没有处理好比如说 httpUtils里面就可以优化很多,目前还没有好的想法。包括model也有很多的优化要做的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352