问题描述
我使用DiffUtil计算RecyclerView中的数据更改。计算是使用RxJava在调度程序线程上异步完成的,如下所示:
fun setResultItems(list: List<FlightResultItem>?) {
Log.d("debugfilter"," setResultItems of size: " + (list?.size?: 0))
list?.let { newList ->
Single.fromCallable { DiffUtil.calculateDiff(ResultItemDiffUtilCallback(ArrayList(newList),ArrayList(resultItems))) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { diffResult ->
Log.d("debugfilter"," setResultItems AFTER DIFF of size: " + (newList.size))
resultItems = ArrayList(newList)
diffResult.dispatchUpdatesTo(this)
}.also { mCompositeSubscription?.add(it) }
}
}
连续调用该函数时,大型数据集的计算将最后完成
D: debugfilter : setResultItems of size: 113
D: debugfilter : setResultItems of size: 7
D: debugfilter : setResultItems AFTER DIFF of size: 7
D: debugfilter : setResultItems AFTER DIFF of size: 113
有什么方法可以让方法调用排队并等待执行完成之后再执行另一个?
解决方法
我认为您可以使用Scheduler.single()创建单线程Worker。它将顺序处理请求。
fun setResultItems(list: List<FlightResultItem>?) {
Log.d("debugfilter"," setResultItems of size: " + (list?.size?: 0))
list?.let { newList ->
Single.fromCallable { DiffUtil.calculateDiff(ResultItemDiffUtilCallback(ArrayList(newList),ArrayList(resultItems))) }
.subscribeOn(Schedulers.single())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { diffResult ->
Log.d("debugfilter"," setResultItems AFTER DIFF of size: " + (newList.size))
resultItems = ArrayList(newList)
diffResult.dispatchUpdatesTo(this)
}.also { mCompositeSubscription?.add(it) }
}
}