Интерфейс блокировки Diffutils при обновлении от 10 до 15 элементов в обзоре переработчика
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
final DiffUtil.DiffResult diffResult =
DiffUtil.calculateDiff(new DiffCb(oldItems, newItems));
handler.post(new Runnable() {
@Override
public void run() {
applyDiffResult(newItems, diffResult);
}
});
}
}).start();
}
Вот как я делаю вычисления и обновляю свой список. Но когда я обновляю 2,3 пункта, он работает отлично. Но когда я обновляю элемент вроде 20, он блокирует пользовательский интерфейс на 10 секунд.
1 ответ
Это связано с тем, что согласно документу обработчика задача выполняется в любом потоке, в котором создан обработчик. В данном случае это ваш поток пользовательского интерфейса.
Когда вы создаете новый обработчик, он привязывается к потоку / очереди сообщений потока, который его создает
Вам нужно использовать HandlerThread, где вы назначаете Handler его собственный рабочий поток для операции.
Сделайте это вместо этого при инициализации вашего обработчика:
HandlerThread thread = new HandlerThread("newthread");
thread.start();
Handler handler = new Handler(thread.getLooper());
Кроме того, проверьте эту ссылку для получения дополнительной информации и рекомендаций по использованию HandlerThread.