Android 当用于搜索或筛选列表时,是否需要使用协同路由挂起DiffulicCallback? fun updateItems( 新项目:列表?, itemSame:(T,T)->布尔值, contentSame:(T,T)->布尔值 ) { 瓦尔衍射结果= DiffUtil.calculateDiff(DiffCalc(this.items,newItems!!,itemSame,contentSame)) dispatchUpdatesTo(此) 项目=新项目 }

Android 当用于搜索或筛选列表时,是否需要使用协同路由挂起DiffulicCallback? fun updateItems( 新项目:列表?, itemSame:(T,T)->布尔值, contentSame:(T,T)->布尔值 ) { 瓦尔衍射结果= DiffUtil.calculateDiff(DiffCalc(this.items,newItems!!,itemSame,contentSame)) dispatchUpdatesTo(此) 项目=新项目 },android,kotlin,android-recyclerview,coroutine,android-diffutils,Android,Kotlin,Android Recyclerview,Coroutine,Android Diffutils,使用协同程序挂起此操作是否是一种良好的做法?根据列表中的项目数,DiffUtil.calculateDiff可能需要大量时间执行(超过允许的16毫秒)。 因为您不想阻止UI线程,所以最好将此函数调用移动到另一个线程,然后在UI线程上分派结果 当然,您可以使用您喜欢的任何技术:AsyncTask、RxJava调度器,或者使用withContext(Dispatchers.Default)移动到另一个协同程序上下文。 但是这种模式非常常见,它已经在RecyclerView库中实现了:。 当使用sub

使用协同程序挂起此操作是否是一种良好的做法?

根据列表中的项目数,
DiffUtil.calculateDiff
可能需要大量时间执行(超过允许的16毫秒)。 因为您不想阻止UI线程,所以最好将此函数调用移动到另一个线程,然后在UI线程上分派结果

当然,您可以使用您喜欢的任何技术:
AsyncTask
、RxJava调度器,或者使用
withContext(Dispatchers.Default)
移动到另一个协同程序上下文。 但是这种模式非常常见,它已经在RecyclerView库中实现了:。
当使用
submitList
更新
ListAdapter
的项目时,差异是在后台线程上计算的,您不再需要调用
calculateDiff
dispatchUpdatesTo

如果我使用RecyclerView.Adapter,ListAdapter将从该类右侧扩展。那么,在使用RecyclerView.Adapter时是否需要挂起“需要挂起”是什么意思?如果你的意思是“从UI线程卸载”,那么是的,你应该这样做。是的,RecyclerView适配器会自动执行吗?不,不会,但是
androidx.RecyclerView.widget.ListAdapter
会执行,这是
ListAdapter.submitList
的文档:如果已经显示了列表,将在后台线程上计算差异,这将在主线程上调度Adapter.notifyItem事件。
fun updateItems(
    newItems: List<T>?,
    itemSame: (T, T) -> Boolean,
    contentSame: (T, T) -> Boolean
) {
    val diffResult =
        DiffUtil.calculateDiff(DiffCalc(this.items, newItems!!, itemSame, contentSame))
    diffResult.dispatchUpdatesTo(this)
    items = newItems
}