Интерфейс блокировки Diffutils при обновлении от 10 до 15 элементов в обзоре переработчика - PullRequest
1 голос
/ 01 июля 2019
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 Ответ

0 голосов
/ 01 июля 2019

Это потому, что согласно doc обработчика, задача выполняется в любом потоке, в котором создан обработчик.В данном случае это ваш поток пользовательского интерфейса.

Когда вы создаете новый обработчик, он привязывается к потоку / очереди сообщений создавшего его потока

Вам нужно использовать HandlerThread, где вы назначаетеОбработчик это собственный рабочий поток для операции.

Сделайте это вместо того, чтобы инициализировать ваш обработчик:

HandlerThread thread = new HandlerThread("newthread");
thread.start();
Handler handler = new Handler(thread.getLooper());

Кроме того, проверьте эту ссылку для получения дополнительной информации и рекомендаций по использованию HandlerThread.

...