Как выполнить несколько runnables с обработчиком? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть RecyclerView. В моем элементе RecyclerView нажмите, чтобы отправить данные на сервер. Но так как пользователь может нажать несколько раз на этот элемент, я отправляю данные только через секунду. Вот мой код.

// Initialized in scope
private final Handler handler = new Handler();
private Map<Integer, Runnable> mRunnableMap = new HashMap<>();

// Initialized in adapter
private long mLastClickTime;
private int lastClickItemPosition;

@Override
    public void onClick(View v) {
        final Game game = getAdapterPosition();

        if (SystemClock.elapsedRealtime() - mLastClickTime < 1000 && lastClickItemPosition == getAdapterPosition())
            handler.removeCallbacks(mRunnableMap.get(getAdapterPosition()));

        mLastClickTime = SystemClock.elapsedRealtime();
        lastClickItemPosition = getAdapterPosition();

        Runnable runnable = () -> sendDataToServer();
        mRunnableMap.put(getAdapterPosition(), runnable);

        handler.postDelayed(mRunnableMap.get(getAdapterPosition()), 1000);
    }

Вот несколько критериев ->

  1. Пользователь может несколько раз щелкнуть один и тот же элемент - отправлять только последнее состояние щелчка через секунду (состояние - что я могу выбрать или отменить выбор элемента и пропорционально обновить или удалить с сервера. Да, мой элемент имеет состояние).
  2. Пользователь может несколько раз щелкнуть один элемент, а затем несколько раз щелкнуть другой элемент. Таким образом, мы должны отправить первый и второй элемент в последнем состоянии через секунду.

Как видите, я проверяю, является ли текущий пользовательский щелчок и истекшее время предыдущего щелчка ниже секунды, и если предыдущий и текущий щелкнутые элементы То же самое, я очищаю обработчик (чтобы предотвратить обработчик отправлять данные в несколько кликов). Но эта проверка не сработала, когда я несколько раз щелкнул по разным элементам, например, несколько раз щелкнул по любому элементу, чем несколько раз щелкнул по другому элементу ... Поэтому для решения этой проблемы я использовал список runnables. Это означает, что каждому элементу в recyclerView соответствует runnable. И это сработало. Но я хочу знать, есть ли другой способ достичь этого?

...