如何在Kotlin / Java中将相同的方法调用排队

问题描述

我使用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) }
}
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...