首页 > 解决方案 > 从 Observable 更新新 API 数据的 UI

问题描述

我太新手了,无法自己处理。我有一种方法,其中一些 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 发送数据一次。之后,UI 不会自行刷新。

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

当发出来自 Observable 的新数据时,如何扩展 Observer 以响应事件驱动?我正在寻找类似的东西它只会刷新 recyclewView。

目前,只有当我一遍又一遍地手动调用自己的- 方法时,我才能刷新 UI。getHead

太感谢了。

标签: androidkotlinobservableandroid-recyclerview

解决方案


据我了解,您的问题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)

顺便说一句,不要忘记处理你的Disposable物品。


推荐阅读