RxJava - 将 Observable 作为参数传递给方法
RxJava - Passing Observable as argument to method
将 Observabele 作为方法参数传递是否有代码味道?
我的项目使用 RxJava。
比如说我有以下 class:
public class MyClass{
//constructor and other property
public void doWork(Observable<SomeClass> obs){
//do things with the input observable
}
我不太愿意将 Observable 传递给一个方法,但我可能错了但没关系?
好的,根据您的评论,它应该是这样的:
class A {
public final Observable<String> observable = Observable
.just("some string")
.replay(1).refCount()
}
class B(A aObject) {
subscription = aObject
.map { /*Do something on "some string"*/ }
.subscribe(...)
}
请注意,如果您要多次使用此 observable(创建其他一些 observable,并在其他地方订阅它)并且如果它是一些获取数据的 Observable(获取数据),则需要 .replay(1).refCount()
来自 API/DB)。
但如果observable
不是"getting data from somewhere",而是一些时间敏感的动作(如用户点击、滚动等),最好使用.share()
而不是.replay(1).refCount()
已编辑
根据您对点击的评论:我建议使用 lib。有了它,您的代码将如下所示:
class A {
public final Observable<String> observable = someButton.clicks()
.map { /* pass data you want here (get text from EditText)*/ }
.share()
}
class B(Observable<String> observable) {
subscription = observable
.map { /*Do something on "some string"*/ }
.subscribe(...)
}
但是如果你想让它变得更多 "RX",或者你需要在其他地方使用 editText 中的文本,你可以这样做:
class A {
public final Observable<Void> clickObservable =
someButton.clicks().share()
public final Observable<String> textObservable = editText.textChanges()
.map { it.toString }
.share()
}
class B(Observable<String> textObservable, Observable<Void> clickObservable) {
subscription = clickObservable
.withLatestFrom { click, text -> text }
.subscribe(...)
// textObservable can be used more here
}
将 Observabele 作为方法参数传递是否有代码味道? 我的项目使用 RxJava。 比如说我有以下 class:
public class MyClass{
//constructor and other property
public void doWork(Observable<SomeClass> obs){
//do things with the input observable
}
我不太愿意将 Observable 传递给一个方法,但我可能错了但没关系?
好的,根据您的评论,它应该是这样的:
class A {
public final Observable<String> observable = Observable
.just("some string")
.replay(1).refCount()
}
class B(A aObject) {
subscription = aObject
.map { /*Do something on "some string"*/ }
.subscribe(...)
}
请注意,如果您要多次使用此 observable(创建其他一些 observable,并在其他地方订阅它)并且如果它是一些获取数据的 Observable(获取数据),则需要 .replay(1).refCount()
来自 API/DB)。
但如果observable
不是"getting data from somewhere",而是一些时间敏感的动作(如用户点击、滚动等),最好使用.share()
而不是.replay(1).refCount()
已编辑
根据您对点击的评论:我建议使用 lib。有了它,您的代码将如下所示:
class A {
public final Observable<String> observable = someButton.clicks()
.map { /* pass data you want here (get text from EditText)*/ }
.share()
}
class B(Observable<String> observable) {
subscription = observable
.map { /*Do something on "some string"*/ }
.subscribe(...)
}
但是如果你想让它变得更多 "RX",或者你需要在其他地方使用 editText 中的文本,你可以这样做:
class A {
public final Observable<Void> clickObservable =
someButton.clicks().share()
public final Observable<String> textObservable = editText.textChanges()
.map { it.toString }
.share()
}
class B(Observable<String> textObservable, Observable<Void> clickObservable) {
subscription = clickObservable
.withLatestFrom { click, text -> text }
.subscribe(...)
// textObservable can be used more here
}