【问题标题】:Return a list of items after Observable is completeObservable 完成后返回项目列表
【发布时间】:2021-08-25 09:01:09
【问题描述】:

我需要返回一个项目列表,但在此之前我必须检查一些特定的项目。我只能异步执行此操作。

fun getItemList() : List<Model> {
val list = mutableListOf<Model>()
list.add(model1)
list.add(model2)

Observable.fromCallable { findParticularModel() }
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(object : Observer<String> {
            override fun onSubscribe(d: Disposable?) {

            }

            override fun onNext(modelId: String) {
                list.add(createModelFromId(modelId))
            }

            @SuppressLint("TimberExceptionLogging")
            override fun onError(e: Throwable?) {
                Timber.e(e?.message)
            }

            override fun onComplete() {

            }

        })

return list
}

如何在Observable完成后才返回列表

【问题讨论】:

  • 如果getItemList在主线程上运行,这是不可能的,因为它会死锁。您必须将其转换为 Single&lt;List&lt;Model&gt;&gt; 并继续编写。
  • @akarnokd,是的,getItemList 旨在在主线程上调用。你能提供一个解决方案吗?
  • 您需要将整个getItemList() 重新设计为异步的,而不仅仅是其内容。有一些技术方法可以等待列表准备好返回,但如果你这样做,代码将等同于 return findParticularModel() 之类的东西 - 没有所有这些异步内容。无论您想在返回后对生成的list 做什么,都需要在onComplete() 中执行此操作。您的函数无法返回列表并同时异步工作。
  • 或者,您可以切换到调用堆栈中较早的某个地方的后台线程,然后使此函数完全同步(因此删除 Rx 的东西)。

标签: java android multithreading kotlin rx-java


【解决方案1】:

以下是如何创建和使用此类异步数据源的示例:

fun getItemList() : Single<List<Model>> {
    Single.fromCallable { findParticularModel() }
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .map {
             val list = mutableListOf<Model>()
             list.add(model1)
             list.add(model2)
             list.add(createModelFromId(it))
             list
        }
        
}

getItemList().subscribe({
    // here you have $it as list on the main thread
}, {
    Timber.e(it?.message)
})

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多