RXjava+Retrofit的封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Bu_siliang/article/details/80524151
  1. Rxjava+retrofit已经用了很久了,网上的讲解也是一大堆。但都是大同小异。为此我也不多说一些废话了,就把自己项目中用到的,和理解的跟大家分享一下。小白带大家走走,瞧瞧:
    ## 用到的依赖 ##
    //fastjson
    compile ‘com.alibaba:fastjson:1.1.62.android’
    //网络
    compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
    compile ‘io.reactivex.rxjava2:rxjava:2.1.0’
    compile ‘com.squareup.retrofit2:retrofit:2.3.0’
    compile ‘com.squareup.retrofit2:converter-scalars:+’
    compile ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’

一: 首先对api,网络请求类型的封装,我们用到的是Retrofit 的注解,还有不了解的小伙伴可以去Retrofit的介绍

public interface ApiService {


    @GET
    public Call<String> get1(@Url String url);


    @GET
    public Observable<String> get(@Url String url);


    @GET
    public Observable<String> get(@Url String url, @QueryMap Map<String, String> map);


    @FormUrlEncoded
    @POST
    public Observable<String> post(@Url String url, @FieldMap Map<String, String> map);


    //上传图片
    @Multipart
    @POST("s=Upload/upload")
    Observable<String> uploadPhoto(@Part("sfile") MultipartBody file);

}

二:其次我们写一个retrofit 的管理类,用来调用不同的网络请求

public class RetrofitManager {

    //  用不到可以不写
    //    private static OkHttpClient okHttpClient = new OkHttpClient.Builder()
    //            .cookieJar(new CookiesManager(IApplication.application))
    //            .connectTimeout(20, TimeUnit.SECONDS)
    //            .readTimeout(20,TimeUnit.SECONDS)
    //            .writeTimeout(20,TimeUnit.SECONDS)
    //            .addNetworkInterceptor(new LoggingInterceptor())//自定义的日志拦截器
    //            .build();


    private static ApiService apiService = new Retrofit.Builder()
            .baseUrl("这里写上项目中用到的ip")
            .addConverterFactory(ScalarsConverterFactory.create())
            // .client(okHttpClient)
            //把 以前的 call 转化成 Observable
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//也是Rxjava与retrofit 的关联
            .build().create(ApiService.class);


    public static void get(String url, Observer<String> observer) {
        apiService.get(url)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())//切换线程
                .subscribe(observer);
    }


    public static void get(String url, Map<String, String> map, Observer<String> observer) {
        apiService.get(url, map).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }


    public static void post(String url, Map<String, String> map, Observer<String> observer) {

        //        SortUtils.sortString(map)  mao key 排序
        //        SortUtils.getMapResult(map)  map 拼接成字符串  返回值string
        //        JNICore.getSign(string)   md5(appkey=11111&string)
        //
        //      String sign =  JNICore.getSign(SortUtils.getMapResult(SortUtils.sortString(map))) ;
        //     map.put("user.sign",sign);

        apiService.post(url, map).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }

    public static void uploadPhoto(MultipartBody multipartBody, Observer<String> observer) {
        apiService.uploadPhoto(multipartBody)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }


}

三:我们需要一个公用的解析类

public abstract class BaseObserver1<T> implements Observer<String> {


    /**
     * 项目框架搭建
     * 1 通用模块的封装  1 共用UI  2 父类定义方法 子类实现
     * 2 通用网络请求模块  定义错误编码
     * 3 常用工具类的封装
     * 4 basemvpactivity  basemvpfragment
     * 5 主框架页面结构
     * 6 fragment 切换 通用
     * 7 rxjava retrofit mvp
     *
     * @param d
     */
    private String tag;

    public BaseObserver1(String tag) {
        this.tag = tag;
    }

    @Override
    public void onSubscribe(Disposable d) {


    }


    @Override
    public void onNext(@NonNull String s) {
        try {

            Type genType = getClass().getGenericSuperclass();
            Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
            Class entityClass = (Class) params[0];
            T t = (T) JSON.parseObject(s, entityClass);

            KLog.e(s);
            onSuccess(t, tag);
        } catch (Exception e) {

            onFailed(JSON_FORMAT_ERROR);
            e.printStackTrace();
        }

    }

    @Override
    public void onError(@NonNull Throwable e) {
        try {
            if (e != null) {
                if (e instanceof HttpException) {
                    onFailed(HTTP_ERROR);
                } else if (e instanceof SocketException) {
                    onFailed(NET_WORK_ERROR);
                } else {
                    onFailed(UNKNOW_ERROR);
                }
            } else {
                onFailed(UNKNOW_ERROR);
            }
            e.printStackTrace();
            System.out.println();
            KLog.i(e);
        } catch (Exception e1) {
            onFailed(UNKNOW_ERROR);
            e1.printStackTrace();
        }
    }

    @Override
    public void onComplete() {

    }


    public abstract void onSuccess(T result, String tag) throws RemoteException;

    /**
     * code
     * 1000 UNKNOW_ERROR 未知错误
     * 1001 json 转化异常  parse error
     * 1002 当前网络不可用     java.net.SocketException: Network is unreachable  超时
     * 1003 服务器不可用 401 402 403 500 502 503 504
     *
     * @param code
     */
    public abstract void onFailed(int code);


    public static final int UNKNOW_ERROR = 1000;
    public static final int JSON_FORMAT_ERROR = 1001;
    public static final int NET_WORK_ERROR = 1002;
    public static final int HTTP_ERROR = 1003;

    //    HttpException 都属于 http exception
    //    private static final int UNAUTHORIZED = 401;
    //    private static final int FORBIDDEN = 403;
    //    private static final int NOT_FOUND = 404;
    //    private static final int REQUEST_TIMEOUT = 408;
    //    private static final int INTERNAL_SERVER_ERROR = 500;
    //    private static final int BAD_GATEWAY = 502;
    //    private static final int SERVICE_UNAVAILABLE = 503;
    //    private static final int GATEWAY_TIMEOUT = 504;

}

完成以上三部,我们就对Rxjava与Retrofit 进行了一个基本的简单封装.。掉用方法如下:

    1:url  2:拼接参数  3new 观察者  loginbean就是解析的实体bean
    RetrofitManager.post(MyContants.BASEURL + "s=Login/login", map, new BaseObserver1<Loginbean>("") {
            @Override
            public void onSuccess(Loginbean result, String tag) {
                if(result.getCode()==200){
                    Loginbean.DatasBean datas = result.getDatas();//result 返回解析的结果


                }

            }
            @Override
            public void onFailed(int code) {
               ToastUtils.show(LoginActivitys.this,code+"",1);
            }
        });
    }
是不是很简单呢,啊哈哈!!!!

猜你喜欢

转载自blog.csdn.net/Bu_siliang/article/details/80524151