Оператор восстановления Android Rx - PullRequest
0 голосов
/ 06 декабря 2018

Я только начинаю использовать RxJava и пытаюсь понять, как правильно использовать наблюдаемые.

Ниже у меня есть пейджер, и я хотел бы вызвать веб-сервис на странице.прокрутка, позволяющая избежать множества бесполезных вызовов.

Итак, я обнаружил, что оператор «debounce» - это то, что я ищу, но в моем случае он не работает, и веб-служба вызывается каждый раз ..

v.pager.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {

            val itemPosition : Int = layoutManager.findFirstCompletelyVisibleItemPosition();

            Observable.just(itemPosition).debounce(1500, TimeUnit.MILLISECONDS).map {
                  retrieveUserDetail(userList[itemPosition])
            }.observeOn(AndroidSchedulers.mainThread()).subscribe()

         }
    }
})

Что не так с этим кодом?

1 Ответ

0 голосов
/ 07 декабря 2018

Как объяснили Stack Diego и PPartisan в комментариях, вы должны создать наблюдаемое за пределами слушателя и подписаться на него один раз.Поскольку каждая наблюдаемая испускает только один элемент, debounce не будет иметь никакого влияния.

Ваш код, вероятно, будет выглядеть примерно так:

Объявите вашу тему как переменную-член.

val subject: PublishSubject<Int> = PublishSubject.create()

Подпишитесь на тему вне слушателя (вы можете сделать это в onResume или onStart, если вы планируете избавиться от наблюдаемого, когда действие приостановлено)

subject
    .debounce(1500, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { retrieveUserDetail(userList[itemPosition]) }

А затем внутри слушателя прокруткисоздать новый элемент при вызове onScrollStateChanged ()

v.pager.addOnScrollListener(object : RecyclerView.OnScrollListener() {

    override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
        super.onScrollStateChanged(recyclerView, newState)
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            val itemPosition : Int = layoutManager.findFirstCompletelyVisibleItemPosition()
            subject.onNext(itemPosition)
         }
    }
})
...