Kotlin, RxJava2 - prosty przykład jak śledzić zmiany Integera nie dzieła

0

Uczę się RxJavy i chciałem sobie spróbować prosty przykład na śledzenie zmiany mojego Inta.

Tutaj kod:

class MainActivity : AppCompatActivity() {

lateinit var button: Button
var counter: Int = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)


    val observable :Observable<Int> = Observable.just(counter)

    button = findViewById(R.id.button)

    button.setOnClickListener(View.OnClickListener {
        counter++
    })


    observable.subscribe(
            Consumer { t ->
                Log.d("fromObservable", counter.toString()) }
        )
    }
}

Logowanie na konsole nie jest wywoływane przy każdym kliknięciu w Buttona, tak jak to miałem w zamyśle. Jak w takim razie mogę śledzić zmiany jakiejś zmiennej przez Observable w tym przykładzie i reagować na tą zmianę?

0

Oj, widzę że kompletnie nie zrozumiałeś tematu :) W tej implementacji twój Observable nie będzie 'magicznie' reagował na zmiany zmiennej counter. To co chcesz osiągnąć możesz zaimplementować za pomocą Subject. http://reactivex.io/documentation/subject.html

1

Nie implementujesz tego poprawnie.

Observable.just(counter) stworzy Observable, który będzie emitował wartość tego countera a potem wywoła complete. Dokumentacja

To co chcesz zrobić, to powinieneś użyć Subject np. BehaviorSubject. Tutaj też link do dokumentacji Dokuemntacja Subject

Czyli przykładowo można to zaimplementować tak:

class MainActivity : AppCompatActivity() {

    lateinit var button: Button
    var counter: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val subject: BehaviorSubject<Int> = BehaviorSubject.createDefault(counter)
        val observable: Observable<Int> = subject.hide()

        button = findViewById(R.id.button)

        button.setOnClickListener(View.OnClickListener {
            subject.onNext(++counter)
        })

        observable.subscribe(
                Consumer { t ->
                    Log.d("fromObservable", counter.toString()) }
            )
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1