обновить пользовательский интерфейс на новых данных API из Observable - PullRequest
1 голос
/ 11 октября 2019

Я слишком новичок, чтобы справиться с этим самостоятельно. У меня есть метод, в котором некоторые данные API хранятся в Observable, и я пытаюсь запустить это событие каждые 60 секунд. Я делаю это, потому что я хочу предоставить recyclerView фактические данные. Если из API поступили новые данные, recyclewView должен обновиться.

Это метод, при котором я получаю данные из API:

fun getHead(status : String , wenr : Long, test : Boolean) {
        view.onShowDialog("")
        val headResponseObservable: Observable<List<WeKopf>> = apiService.getWEKopf(status, wenr, test) // an action must be done each time when a property’s value changes.
        Observable.interval(60, TimeUnit.SECONDS)
            .flatMap<Any> { n -> headResponseObservable }
            .repeat()
            .subscribe()
        subscribe(headResponseObservable, this, mainScheduler)
    }

Метод подписки выглядит следующим образом:

    protected fun <T> subscribe(observable: Observable<T>, observer: Observer<T>, scheduler : Scheduler) {
        observable.subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.computation())
            .observeOn(scheduler)
            .subscribe(observer)
    }

Проблема в том, чтоObservable отправляет данные в Observer только один раз. После этого пользовательский интерфейс не обновляется сам по себе.

   override fun onComplete() {
        view.onHideDialog()
    }

    override fun onSubscribe(d: Disposable) {
        addToCompositeDisposable(d)
    }

    override fun onNext(t: List<WeKopf>) {
        view.onHideDialog()
        view.displayHeads(t)
    }

    override fun onError(e: Throwable) {
        view.onHideDialog()
        view.onError("Error getting supplier head: " + e.message)
    }

Как я могу расширить Observer, чтобы он реагировал на события, когда генерируются новые данные из Observable? Я ищу что-то похожее на this , которое обновит только recyclewView.

В настоящее время я могу обновить пользовательский интерфейс, только если я вручную звони моему getHead методу снова и снова.

Большое спасибо.

1 Ответ

3 голосов
/ 11 октября 2019

Насколько я понял, твой вопрос getHead() нужно назвать один раз, верно? В этом случае я предлагаю вам упростить ваш код следующим образом:

fun getHead(status: String, wenr: Long, test: Boolean): Observable<List<WeKopf>> =
        Observable.interval(60, TimeUnit.SECONDS)
            .flatMap { apiService.getWEKopf(status, wenr, test) }
            .subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.computation())
            .observeOn(scheduler)
            .also {
                view.onShowDialog("")
            }

А затем вам следует подписаться на результат вашего getHead(), например:

getHead(status, wenr, test).subscribe(observer)

ByКстати, не забудьте в конце концов избавиться от своих Disposable объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...