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
0
二维码
打赏
海报
Retrofit2学习之九:与RxJava结合
需求:实现用户登录,然后通过登陆返回的用户Id获取用户信息。
普通实现
创建业务请求接口
public interface Api {
@POST("login/json")
……
文章目录
关闭
共有 0 条评论