1. 程式人生 > >RXjava+Retrofit的封裝

RXjava+Retrofit的封裝

  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);
            }
        });
    }
是不是很簡單呢,啊哈哈!!!!