2017-08-08 61 views
0

我写使用RxJava一个仓库时遇到了问题搞清楚处理写入和删除,以回购的最佳方式方法。RxJava,副作用,并返回void

当写这个,我的目标是确保任何写入或删除方法将能够从RxJava副作用的方法调用。这意味着写/删除方法必须同步运行,并且不返回Observable。这样一来,我可以做这样的事情:

repository 
    .fetchData() 
    .doOnNext(s -> if (s.equals("something") { 
         repository.writeData(s); 
        } 
    ) 
    .subscribe(); 

这是一个简单的例子,但它表明我调用返回一个可观察的仓库方法,订阅的观察到的,当可观察的onNext()方法被调用我可以执行我的副作用,这是一个同步写入内存缓存或数据库。

好了,让例子的伟大工程,但现在我有一个问题,我只需要编写或从我的内存缓存或数据库中删除数据。也就是说,我想使用RxJava在方法返回void的地方运行同步代码。

我的版本库的API是写我想要做的事,如呼叫repository.deleteData()的方式,但我想这样做掉主线程。解决这个问题的一种方法是放弃RxJava并创建一个线程来执行任务。这会起作用,但我会用RxJava来做所有其他事情,所以我也想在这里使用它。

我发现2个可能的解决办法,但我不知道他们是如何正确的是:

1)使用Observable.just(null)揭开序幕可观察到的,然后使用doOnNext()副作用的方法来从打电话给我的资料库的方法。这看起来好像很诡异,但它让我可以使用RxJava,并让我指定线程来订阅/观察,这使得线程变得容易,并允许存储库的API保持不变,以便它仍然返回void。

2)我也可以做一些事情,如Observable.defer(),然后从推迟的调用方法我可以返回Observable.just(repository.deleteData())。如果我这样做,我必须更改存储库的API,以便deleteData方法具有void返回类型而不是void(并且该方法还添加了return null;以履行方法签名的合同)。这也允许我使用RxJava,指定我想观察哪些线程并订阅并继续使用Observable,即使我真正在做的是副作用。

是否有RxJava一种方式来创建一个可观察它调用与运行的副作用的方法外同步代码void返回类型的方法?

+0

此[链接](https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#nulls)可以帮助你。考虑rxjava和rxjava2之间的区别,我认为你的第一个解决方案是常见的用法。 –

+0

所以你想从你的同步方法构造Observables? – yosriz

回答

0

那么,为什么不是这样?

public static <T> Observable<T> observeCompletion(Runnable r) { 
    return Observable.defer(() -> { 
     r.run(); 
     return Observable.empty(); 
    }; 
} 

现在你可以做的线程跳你通过onSubscribe需要,你把一切都在的Rx。