我是RxJava的新手,并且想了解Observable。因此,我正在使用改造进行一次API调用,并且观察到结果的变化,所以我的问题是:
这是一个代码段:
// fetching list of recipes
mRecipeListViewModel.getRecipes().observe(this, new Observer<List<Recipe>>() {
@Override
public void onChanged(@Nullable List<Recipe> recipes) {
// showing list of recipes
}
});
答案 0 :(得分:1)
那是...很多问题。
答案是“取决于”。
显示您的服务类别(在其中定义Retrofit调用)。
改型调用通常是Single
而不是Observable
,因为API将返回结果并结束调用,因此在这种情况下使用observable毫无意义(单是...一个结果或一个错误)。
一次:)
当您期望观察到的可观察对象发出值时(通过onNext),您可以观察到一个可观察对象,这样您就可以观察事物列表并逐一发出它的项。或者您可能有一个API,它是一个开放的套接字,不时地发出项目; RXJava可以帮助您订阅所述发射并处理每个项目(onNext()..)
如果您不使用RxJava,我会使用LiveData。 RX很不错,但是它非常庞大,如果您要做的只是调用翻新的Single api,我个人就不会为RX所困扰。 RX的力量来自众多(有时是无法理解或使用)操作员(地图,平面图,开关等)。及其超级流畅的API。它可以执行非常强大的功能,并且为此编写了许多适配器和扩展。它也可以被滥用来回地狱。除非我有一个特定的用例Rx非常擅长使用
这与RX无关,而与您的体系结构有关。您是否在生命周期方法中称呼改造? (例如onStart?)还是在用户互动时调用它(例如,按一个按钮)。无论哪种情况,RX都与它无关,除非被告知,否则不会调用任何东西。
Things
之类的“ List<Thing>
”列表,那么您可以考虑在服务类中使其成为Observable<Thing> getThings()
。那可行。但这不是它的工作方式。该API可能会发送一个Array(这就是它作为列表的原因),因此实际上,它必须看起来像Observable<List<Thing>> getThings()
,所以当您订阅时,它看起来就像(这是伪代码):api.getThing()
.blah()
.blah()
.subscribe(...)
订阅有3种方法:
onError
onNext
和onComplete
如果您查看OnNext
,它将看起来像onNext(List<Thing> things)
,因此,来自Observable的每个发射都是一个LIST,而不是您最初认为的:“ onNext(Thing thing)
您可以将things
添加到列表中。
这不是它的工作方式。如果您的API返回事物列表,则可能需要将其声明为:
Single<List<Thing>>
,因为您的订阅实际上将具有2种方法,而不是3种方法:
onError
和onSuccess(List<Thing> things)
(如果名称不是100%准确,很抱歉,我已经有两年没有接触RX了)。如此看来,API要么返回列表,要么返回错误,不存在null,next,complete。收到列表后,您的订阅将不再发出。
我希望这可以帮助您更多地了解使用RxJava的含义(这是一个承诺!)