Observable 完成后返回项目列表
Posted
技术标签:
【中文标题】Observable 完成后返回项目列表【英文标题】:Return a list of items after Observable is complete 【发布时间】: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<List<Model>>
并继续编写。
@akarnokd,是的,getItemList
旨在在主线程上调用。你能提供一个解决方案吗?
您需要将整个getItemList()
重新设计为异步的,而不仅仅是其内容。有一些技术方法可以等待列表准备好返回,但如果你这样做,代码将等同于 return findParticularModel()
之类的东西 - 没有所有这些异步内容。无论您想在返回后对生成的list
做什么,都需要在onComplete()
中执行此操作。您的函数无法返回列表并同时异步工作。
或者,您可以切换到调用堆栈中较早的某个地方的后台线程,然后使此函数完全同步(因此删除 Rx 的东西)。
【参考方案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)
)
【讨论】:
以上是关于Observable 完成后返回项目列表的主要内容,如果未能解决你的问题,请参考以下文章
TypeScript - 等待 observable/promise 完成,然后返回 observable
在 Angular 11 中完成 Observable 和渲染后如何运行代码?