Rx Java - передача наблюдаемого в качестве аргумента методу - PullRequest
0 голосов
/ 04 апреля 2020

Запах кода - передать Observabele в качестве аргумента метода? Я использую Rx Java для моего проекта. Скажем, например, у меня есть следующий класс:

public class MyClass{
//constructor and other property
public void doWork(Observable<SomeClass> obs){
//do things with the input observable
}

Я не заполняю удобную передачу Observable для метода, но я могу ошибаться, и это нормально?

1 Ответ

1 голос
/ 05 апреля 2020

Хорошо, так что согласно вашему комментарию это должно быть что-то вроде:

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(...)
}

Обратите внимание, что .replay(1).refCount() необходимо, если вы собираетесь использовать эту наблюдаемую более одного раза (для создания какой-то другой наблюдаемой и подпишитесь на это в другом месте) И если это какие-то данные, то Наблюдаемые (получение данных из API / БД).

Но если observable - это не "получение данных откуда-то", а какое-то чувствительное ко времени действие (например, щелчок пользователя, прокрутка и т. Д. c.), Лучше использовать .share() вместо .replay(1).refCount()

EDITED

в соответствии с вашим комментарием о клике: я рекомендую использовать 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
}
...