Retrofit2学习之九:与RxJava结合

需求:实现用户登录,然后通过登陆返回的用户Id获取用户信息。

普通实现

创建业务请求接口

public interface Api {

    @POST("login/json")
    Call<ResponseResult> login(@Body UserParam param);

}

创建一个Retrofit的实例,然后利用Retrofit实例创建接口对象和调用接口方法

public void login(View view) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_ADDRESS)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    api = retrofit.create(Api.class);

    api.login(new UserParam("AppBlog.CN", "123456")).enqueue(new Callback<ResponseResult>() {
        @Override
        public void onResponse(Call<ResponseResult> call, Response<ResponseResult> response) {
            if (response.isSuccessful()) {
                int userId = response.body().getUserId();
                api.getUserInfoWithPath(userId).enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {
                        if (response.isSuccessful()) {
                            User user = response.body();
                            Toast.makeText(MainActivity.this, user.getUsername(), Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) {
                        Log.i(TAG, "请求失败: " + t.getLocalizedMessage());
                    }
                });
            }
        }

        @Override
        public void onFailure(Call<ResponseResult> call, Throwable t) {
            Log.i(TAG, "登录失败: " + t.getLocalizedMessage());
        }
    });
}

缺点:代码繁琐,嵌套多不方便扩展

与RxJava结合

添加依赖

compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.2.3'

创建业务请求接口

public interface Api {

    @POST("login/json")
    Observable<ResponseResult> loginWithRx(@Body UserParam param);

}

创建一个Retrofit的实例,然后利用Retrofit实例创建接口对象和调用接口方法

//嵌套写法
public void loginWithRx(View view) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_ADDRESS)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    api = retrofit.create(Api.class);

    api.loginWithRx(new UserParam("AppBlog.CN", "123456")).subscribeOn(Schedulers.io()).subscribe(new Subscriber<ResponseResult>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
            Log.i(TAG, "登录失败: " + e.getLocalizedMessage());
        }

        @Override
        public void onNext(ResponseResult responseResult) {
            api.getUserInfoWithRx(responseResult.getUserId())
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Action1<User>() {
                        @Override
                        public void call(User user) {
                            Toast.makeText(MainActivity.this, user.getUsername(), Toast.LENGTH_SHORT).show();
                        }
                    });
        }
    });
}

优点:

  • 使用RxJava适配器 addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 可以实现返回Body自动转换为ResponseResult对象
  • 使用 subscribeOn(Schedulers.io())observeOn(AndroidSchedulers.mainThread()) 轻松实现IO线程和UI线程间的切换

缺点:代码嵌套仍然过多,不方便扩展

RxJava链式写法

创建业务请求接口

public interface Api {

    @GET("user/{id}")
    Observable<User> getUserInfoWithRx(@Path("id") int userId);

}

创建一个Retrofit的实例,然后利用Retrofit实例创建接口对象和调用接口方法

//链式写法
public void loginWithRxChain(View view) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(SERVER_ADDRESS)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    api = retrofit.create(Api.class);

    api.loginWithRx(new UserParam("AppBlog.CN", "123456")).flatMap(new Func1<ResponseResult, Observable<User>>() {
        @Override
        public Observable<User> call(ResponseResult responseResult) {
            return api.getUserInfoWithRx(responseResult.getUserId());
        }
    }).doOnNext(new Action1<User>() {
        @Override
        public void call(User user) {
            //download avatar
        }
    }).doOnSubscribe(new Action0() {
        @Override
        public void call() {

        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<User>() {
        @Override
        public void call(User user) {
            Toast.makeText(MainActivity.this, user.getUsername(), Toast.LENGTH_SHORT).show();
        }
    });
}

优点:代码链式写法,结构清晰,扩展方便

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/25/retrofit2-learning-9-combine-with-rxjava/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Retrofit2学习之九:与RxJava结合
需求:实现用户登录,然后通过登陆返回的用户Id获取用户信息。 普通实现 创建业务请求接口 public interface Api { @POST("login/json") ……
<<上一篇
下一篇>>
文章目录
关闭
目 录