【发布时间】: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 的东西)。
标签: java android multithreading kotlin rx-java