【问题标题】:update UI on new API data from Observable从 Observable 更新新 API 数据的 UI
【发布时间】:2019-10-11 09:52:00
【问题描述】:

我太新手了,不能自己处理。我有一种方法,其中一些 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 以响应事件驱动?我正在寻找类似this 的东西,它只会刷新recyclewView。

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

非常感谢。

【问题讨论】:

    标签: android kotlin observable android-recyclerview


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的努力。你能告诉我应该在哪里订阅 getHead() 的结果吗?
    • 不客气 :) 您应该在调用 getHead() 的同一个地方订阅。我认为这是基于您的业务逻辑。
    • 很抱歉,修改后的getHead-方法没有按预期工作。首先,如果没有创建 Observable 对象并首先覆盖它的方法,我无法在调用该方法的 Activity 中订阅结果。 subscribe() 没有参数也不能正常工作。并且 recyclerView 适配器无法在 UI 上显示数据 - 至少 UI 中的 View 是空的。调用getHead 方法的频率无关紧要。 recyclerView 应该自行更新,以防新数据从 API 中出来。无论如何,非常感谢您的努力。鲍里斯
    • 嗯。这很奇怪,因为我刚刚测试了我的解决方案并且它有效。您能否解释一下“在没有创建 Observable 对象并首先覆盖它的方法的情况下,我无法在调用该方法的 Activity 中订阅结果。”?在我的解决方案中,getHead() 的结果是Observable&lt;List&lt;WeKopf&gt;&gt;,所以你得到 Observable 对象,你可以订阅你的观察者。你的apiService.getWEKopf(status, wenr, test) 会返回什么?还有,说到 Android,你为你的observeOn() 函数提供了哪个调度器?
    • 感谢您抽出宝贵时间与我分享您的知识。我打电话给ObserveOn(mainScheduler)val mainScheduler: Scheduler。我可以在星期一尝试解决方案,只要回到办公室并在硬件上测试应用程序。
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 2018-11-09
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多