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