当发生变化时,RxJava2 observable 不处理 onNext

RxJava2 observable not processing onNext when there is a change

我是 RxJava 的初学者。 我想跟踪 Int 变量的变化并在它发生变化时对其做出反应。

这是我的例子:

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

但是,当我单击按钮时,日志从未调用。 我怎样才能正确地使用 RxJava2?

您创建了一个仅发射一个元素的简单可观察对象,但您可以将 Subject 用于您的用例:

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

您没有正确创建 Observable

Observable.just(counter) 将创建一个 Observable 发出 counter 的值并完成。 Documentation of Observable.just()

你可以用 SubjectBehaviorSubject 做你想做的事。 Documentation of Subject

class MainActivity : AppCompatActivity() {
    lateinit var button: Button

    var counter : Int = 0
        set(value) {
            field = value
            observable.onNext(value)
        }
    val observable : BehaviorSubject<Int> = BehaviorSubject.createDefault(counter)

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

        button = findViewById(R.id.button)

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

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