Есть ли необходимость приостановить 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 больше.

Другие вопросы по тегам