RxJava2学习之六:登录后再获取用户信息

登录后再获取用户信息使用 FlatMap操作符,将用户请求参数转换为返回响应结果,再将响应结果转换为用户信息。

FlatMap 操作符

FlatMap 将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable。

FlatMap 操作符使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这个函数返回一个本身也发射数据的Observable,然后 FlatMap 合并这些Observables发射的数据,最后将合并后的结果当做它自己的数据序列发射。

例如,当你有一个这样的Observable:它发射一个数据序列,这些数据本身包含Observable成员或者可以变换为Observable,因此你可以创建一个新的Observable发射这些次级Observable发射的数据的完整集合。

注意:FlatMap 对这些Observables发射的数据做的是合并( merge )操作,因此它们可能是交错的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SERVER_ADDRESS)
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(Api.class);

UserParam param = new UserParam("appblog.cc", "123456");

Observable.just(param).flatMap(new Function<UserParam, ObservableSource<ResponseResult>>() {
@Override
public ObservableSource<ResponseResult> apply(UserParam userParam) throws Exception {
ResponseResult result = api.login(userParam).execute().body();
return Observable.just(result);
//需要添加Retrofit适配器adapter-rxjava和addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//return api.loginWithRx(userParam);
}
}).flatMap(new Function<ResponseResult, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(ResponseResult responseResult) throws Exception {
User user = api.getUserInfoWithPath(responseResult.getUserId()).execute().body();
return Observable.just(user);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<User>() {
@Override
public void accept(User user) throws Exception {
Toast.makeText(MainActivity.this, user.getUsername(), Toast.LENGTH_SHORT).show();
}
});

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :