java - 在 RxJava 2.x 中使用 flatMap
问题描述
我正在使用自己的 API,并且希望使用 RxJava 链接一些分页结果。我使用基于光标的分页。(假设第一个请求中有 50 个用户):
{
"data":{
"status":"ok",
"total":988, //users total
"has_next_page":true,
"end_cursor":"AQAxd8QPGHum7LSDz8DnwIh7yHJDM22nEjd",
"users":[{"id":"91273813",
"username":"codergirl",
"full_name":"Code Girl",
"picture_url":"https://cdn.com/21603182_7904715668509949952_n.jpg",
},
...
]
}
}
现在,我使用改造获得了前 50 个这样的结果:
public class DataResponse {
@SerializedName("end_cursor")
private String end_cursor;
@SerializedName("users")
private JsonArray users;
@SerializedName("has_next_page")
private Boolean has_next_page;
public boolean hasNextCursor(){
return has_next_page;
}
public String endCursor(){
if (hasNextCursor()){
return end_cursor;
}
return "";
}
public JsonArray getUsers(){
return users;
}
}
然后:
public interface MyService {
@GET( "/users")
Observable<DataResponse> getUsers(
@Query("cursor") String cursor,
);
}
和
MyService service = RetrofitClient.getInstance();
service.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( val-> showUsers(val.getUsers())); // getting the first 50 users
下一个调用应该是“/users?cursor=AQAxd8QPGHum7LSDz8DnwIh7yHJDM22nEjd”
我想返回所有(在本例中为 988)用户
解决方案
我的解决方案
import io.reactivex.Observer;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public void getAllUsers(){
AtomicReference<String> cache = new AtomicReference<>();
AtomicBoolean hasMore = new AtomicBoolean(true);
io.reactivex.Observable.just(0)
// getting the first 50 users
.flatMap(users1-> service.getUsers( cache.get() ))
// scheduler
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
// re-call variable
.repeatUntil(() -> !hasMore.get())
.subscribe(new Observer<DataResponse>() {
@Override
public void onSubscribe(Disposable d) { // on subscribe }
@Override
public void onNext(DataResponse response) {
// saving boolean (If there are more users)
hasMore.set(response.hasNextCursor());
// saving next cursor
cache.set(response.endCursor());
// adding the new 50 users
addToList(response.getUsers());
}
@Override
public void onError(Throwable e) { /*error */ }
@Override
public void onComplete() { /*complete*/ }
});
}
推荐阅读
- vb.net - 如何使用 Visual Basic 从文本文件中获取点坐标?
- html - Refused to load * because it appears in neither the img-src directive nor the default-src directive of the Content Security Policy
- c++ - How to call a method from a different class (area of rectangle)
- javascript - 如何在滚动的某些部分停止固定的背景附件图像
- amazon-web-services - AWS 如何释放 /dev/nvme1n1p1 和 /dev/loop# 处理“设备上没有剩余空间”
- redis - 如何检查redis master上当前打开的连接
- c++ - Qt curllib 无法添加
- stl - MAX_SIZE OF SET
- linux-kernel - rootkit 如何隐藏进程?
- java - Spring 安全 JWT