1

我有一个登录服务在我的活动中使用 Retrofit 和 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 订阅时执行来以不同的方式解决这个问题。我的管理器方法现在使用 defer 并且类似于:

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

订阅我的活动,如上所示。

希望了解我是否在球场上,或者关于如何更好地处理这个用例的任何建议。谢谢!

更新2

所以延迟在这里没有用。登录方法归结为:

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

仍然会感谢对这种方法的任何评论/改进。我遇到的大多数例子只是做了他们订阅的所有事情。

4

0 回答 0