Есть ли необходимость приостановить DiffUtilCallBack, используя сопрограммы, когда он используется для поиска или фильтрации списка?
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
}
Это хорошая практика, чтобы приостановить это с помощью сопрограмм?
1 ответ
В зависимости от количества предметов в списке, DiffUtil.calculateDiff
выполнение может занять значительное время (больше 16 мс). Поскольку вы не хотите блокировать поток пользовательского интерфейса, вам лучше переместить этот вызов функции в другой поток, а затем отправить результат в поток пользовательского интерфейса.
Конечно, вы можете использовать любую технику, какую захотите: AsyncTask
, RxJava Schedulers, или переход в другой сопрограммный контекст с withContext(Dispatchers.Default)
, Но этот шаблон настолько распространен, что он был реализован в библиотеке RecyclerView: ListAdapter. При обновлении пунктов ListAdapter
с участием submitList
, разница рассчитывается в фоновом потоке, вам не нужно звонить calculateDiff
а также dispatchUpdatesTo
больше.