首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在RxJava 2.x中使用flatMap

在RxJava 2.x中使用flatMap
EN

Stack Overflow用户
提问于 2018-06-13 07:08:04
回答 1查看 2.3K关注 0票数 5

我正在使用自己的应用程序接口,我希望使用RxJava链接一些分页的结果。我使用基于指针的分页。(假设第一个请求中有50个用户):

代码语言:javascript
复制
{
    "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个结果,使用retrofit:

代码语言:javascript
复制
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;
    }
}

然后:

代码语言:javascript
复制
public interface MyService  {
    @GET( "/users")
    Observable<DataResponse> getUsers(
            @Query("cursor") String cursor,
    );
}

代码语言:javascript
复制
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)用户的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-13 07:08:04

我的解决方案

代码语言:javascript
复制
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*/ }
        });

}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50827046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档