RxAndroid: синхронно выполнять наблюдаемое

Я начинаю с Rx с RxAndroid и хочу указать имя пользователя GitHub по его API с помощью Retrofit. Каждый запрос API приносит 100 пользователей, после того, как я обработал всех пользователей, я хочу получить следующие 100, но я не понимаю, как это сделать. Кто-нибудь может мне помочь?

Где некоторые фрагменты моего кода

Интерфейс модернизации

interface GitHubService {
    @GET("/users")
    List<User> users(@Query("since") int since);
}

Пользовательский класс

class User {
    private Integer id;
    private String login;

    public String getLogin() {
        return login;
    }

    public Integer getId() {
        return id;
    }
}

И метод onCreate моей деятельности

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    RequestInterceptor requestInterceptor = new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("User-Agent", "Retrofit-Sample-App");
            request.addHeader("Accept", "application/json");
        }
    };

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("https://api.github.com")
            .setRequestInterceptor(requestInterceptor)
            .build();

    GitHubService mWebService = restAdapter.create(GitHubService.class);

    mWebService.users().flatMap(new Func1<List<User>, Observable<User>>() {
            @Override public Observable<User> call(List<User> users) {
                return Observable.from(users);
            }
        }).flatMap(new Func1<User, Observable<String>>(){
            @Override public Observable<String> call(User user) {
                return Observable.just(user.getId() + ": " + user.getLogin());
            }
        })
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                Log.i("TEST", "EXIT");
            }

            @Override
            public void onError(Throwable e) {
                Log.i("TEST", e.getLocalizedMessage());
            }

            @Override
            public void onNext(String s) {
                Log.i("TEST", s);
            }
        });

}

person Guilherme Gonçalves    schedule 05.02.2015    source источник


Ответы (1)


    BehaviorSubject<Integer> pagingSubject = BehaviorSubject.create();

    // subscribe to this observable and do with data whatever you want
    Observable<List<User>> usersObservable = pagingSubject.flatMap(page -> mWebService.users(page)); 

    // fetch pages
    pagingSubject.onNext(1);
    pagingSubject.onNext(2);

Как и выше, вы можете использовать Subject для передачи страниц, которые вы хотите получить. Вы можете вызвать pagingSubject.onNext(page) после завершения запроса (не проверяли, как выглядит запрос пользователей Github, но вы можете получить параметр «с тех пор» для следующего запроса в ответ).

person krp    schedule 09.02.2015