包装可观察/订阅

时间:2015-07-24 19:17:49

标签: android retrofit reactive-programming rx-java rx-android

我在使用Retrofit的Activity中有一个很好的处理登录服务,其中Observable返回类型为:

mApiService.login(new LoginRequest("username", "password"))
    .observeOn(Schedulers.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .doOnNext(loginObjectResponse -> /* write to disk */ )
    .flatmap(loginObjectResponse -> /* manipulate */)
    .subscribe(loginObjectResponse -> /* update UI */, e -> /* update UI */);

我想做的是将doOnNext和flatmap中的逻辑拉出到一个单独的类中,最终将Activity简化为:

mManager.login("username", "password")
    .observeOn(Schedulers.io())
    .subscribeOn(AndroidSchedulers.mainThread())
    .subscribe(booleanResult -> /* update UI */, e -> /* update UI */);

在我的经理类中处理API服务调用。

我正在寻找有关实现这一目标的最佳方法的建议。我显然喜欢我的经理类返回一个Observable,但是我可以继续使用Retrofit Observable(并包装订阅吗?)或者我最好只是让它更加同步并创建并返回一个简单的Observable ?

更新

我遇到了一些样本,这些样本让我考虑通过在我的经理类中构建操作链并在我的Activity中订阅时执行它来实现不同的处理。我的经理方法现在使用延迟和类似:

public Observable login(String username, String password) {
    return Observable.defer(() ->
        mApiService.login(new LoginRequest(username, password))
            .doOnNext(loginResponse -> /* write to disk */ )
            .flatMap(loginResponse -> return Observable.just(loginResponse); )
        );
}

我的活动订阅如上所示。

希望能够洞察我是否参与其中,或者有关如何更好地处理此用例的任何建议。谢谢!

UPDATE2

所以推迟在这里没有任何意义。登录方法归结为:

public Observable login(String username, String password) {
    return mApiService.login(new LoginRequest(username, password))
        .doOnNext(loginResponse -> /* write to disk */ )
        .flatMap(loginResponse -> return Observable.just(loginResponse); )
    );
}

仍然希望对此方法有任何意见/改进。我遇到的大多数示例只是做他们订阅的所有事情。

0 个答案:

没有答案