【问题标题】:RxAndroid: Synchronously execute a observableRxAndroid:同步执行一个 observable
【发布时间】:2015-02-09 23:05:05
【问题描述】:

我从 Rx 开始使用 RxAndroid,我想通过其 API 和 Retrofit 列出 GitHub 用户的名称。每个 API 请求带来 100 个用户,在我处理完所有用户后,我想获得下一个 100 个用户,但我不知道该怎么做。谁能帮帮我?

我的代码的一些 sn-ps 在哪里

改造界面

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);
            }
        });

}

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案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);
    

    如上所述,您可以使用主题来传递您希望获取的页面。您可以在请求完成后调用 pagingSubject.onNext(page)(尚未检查 Github 用户请求的外观,但您可能会在响应中获得下一个请求的“since”参数)。

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多