Интерфейс блокировки 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.

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