美文网首页
Rxjava + Retrofit 实现BaseResult

Rxjava + Retrofit 实现BaseResult

作者: justin_crashed | 来源:发表于2019-04-02 23:22 被阅读0次

    最近在学习Rxjava、Retrofit的使用,同时想到想一般项目中接口返回都是由特定格式,如java后端的Resultful风格,那我们能不能在请求时写一个基础的返回类,并统一对code判断,再来处理。
    答案肯定是可以的。本文只讲使用。

    依赖:

    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.x.y'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    
    

    普通使用案例

    首先创建实体数据类Test

    public class Test {
    
        private static final String TAG = "=====TEST";
    
        String key = "";
    
        String test = "";
    
        public void log() {
            Log.d(TAG,"key="  + key);
            Log.d(TAG, "test=" + test);
        }
    
    }
    

    在写一个接口TestServer,申明请求

    public interface TestService {
        @GET("test.json")
        Observable<Test>getObJson();
    }
    
    

    调用请求

    private void testService() {
          // 实例化一个Retrofit 对象
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://192.168.1.42:8080/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            TestServer service = retrofit.create(TestService.class);
             service.getObJson()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Test>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            
                        }
    
                        @Override
                        public void onNext(Test test) {
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
        }
    

    开发考虑

    我们不可能每个请求都重新创建一个Retrofit对象,
    而且要基于项目后端数据,例如resultful风格,不可能在每个请求都对code判断。
    所以我们要将返回的Call 对象封装,对code判断,并返回具体的数据结构。

    1、写一个result实体类
    // 因为每一个接口返回的数据结构都不同,肯定要用泛型。
    public class Result<T> {
    
        private final String TAG = "Result ====";
    
        private String msg;
    
        private String code = "0";
    
        private T data;
    
        public void logCode() {
            Log.d(TAG, code);
        }
    
        public long getLongCode() {
            long resultCode = 0;
            if(code != null && !code.equals("")) {
                resultCode = Long.parseLong(code);
            }
            return resultCode;
        }
    
        public void log() {
            Log.d(TAG, "msg:" +msg + "\n code:" + code + "\n data:" + data);
        }
    
        public T getResultData() {
            return data;
        }
    
    }
    
    

    注意,此处的get数据的方法不能直接用getCode,会报空指针异常,后续讨论

    然后需要写一个BaseObserver观察者基类

    // 这里还是因为接口返回数据格式问题,使用泛型。
    public abstract class BaseObserver<T> implements Observer<Result<T>> {
    
        private final String TAG = "====BaseObserver===";
    
        /**
         * 请求成功
         * @param t
         */
        public abstract void onSuccess(T t);
    
        /**
         * 当返回的code值错误时的默认方法
         * @param code
         */
        public void onResultCodeErr(long code) {
            Log.d(TAG, "状态码错误,错误码为:" + code);
        }
    
        @Override
        public void onSubscribe(Disposable d) {
            Log.d(TAG, "onSubscribe");
        }
    
        @Override
        public void onNext(Result result) {
            if(result.getLongCode() != 200) {
                onResultCodeErr(result.getLongCode());
            } else {
                onSuccess((T)result.getResultData());
            }
            result.log();
        }
    
        @Override
        public void onError(Throwable e) {
            Log.d(TAG, "onError");
            Log.d(TAG, e.getMessage());
        }
    
        @Override
        public void onComplete() {
            Log.d(TAG, "onComplete");
        }
    }
    
    

    然后我们的Server类就变成了如下:

    public interface TestService {
    
        @GET("test.json")
        Observable<Result<Test>> getTestRxjavaJson();
    
        @GET("test.json")
        Observable<Test>getObJson();
    
    }
    

    调用就变成了这样:

    BaseObserver observer = new BaseObserver<Test>() {
            @Override
            public void onSuccess(Test test) {
                Log.d("======", "onSuccess");
                test.log();
            }
        };
    
        /** Retrofit + Rxjav */
        private void testRxjavaService() {
            Retrofit retrofit = RetrofitUtil.getRetrofit();
            TestService ts = retrofit.create(TestService.class);
            ts.getTestRxjavaJson()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(observer);
        }
    
    

    写的还比较粗糙,单个接口调用时可能效果还不明显。但大致思路是这样的。

    相关文章

      网友评论

          本文标题:Rxjava + Retrofit 实现BaseResult

          本文链接:https://www.haomeiwen.com/subject/xjcobqtx.html