Выполнение Runnables в будущем

Решение, которое поменяет ваш код как минимум, должно состоять в том, чтобы изменить каждый вызов jpgs[x] на jpgs[x % len(jpgs)] 1. Это должно избавиться от IndexError; он в основном обертывает индекс списка «по краям», убедившись, что он никогда не будет большим. Хотя я не уверен, как он будет взаимодействовать с вызовом jpgs[-x].

Альтернативой может быть реализация класса, который создает более длинную последовательность объектов из более короткой. Пример:

from random import shuffle


class InfiniteRepeatingSequence(object):
  def __init__(self, source_list):
      self._source = source_list
      self._current = []

  def next(self):
      if len(self._current) == 0:
          # copy the source
          self._current = self._source[:]

          shuffle(self._current)

      # get and remove an item from a list
      return self._current.pop()

Этот класс повторяет список неограниченно. Он должен использовать каждый элемент один раз перед повторным использованием списка. Его можно легко превратить в итератор (попробуйте изменить next на __next__). Но будьте осторожны, так как класс выше создает бесконечную последовательность элементов.


1 См. « Как работает% в Python? » для объяснения о modulo .

Редактировать: добавлена ​​ссылка на вопрос по модулю.

0
задан Mohammadreza Farahani 19 January 2019 в 19:46
поделиться

1 ответ

Итак, сама идея неплохая, это был просто мой тупой мозг xD. EventBust не показывал, что вызвало исключение, поэтому я просто поместил код в try-catch:

public void onEventMainThread(EventAppStateChanged event) {
        if (event.isState(AppState.NORMAL)) {
            Log.i(TAG, "EventAppStateChanged (to NORMAL) received");
            try {
                for (Runnable runnable : toBeExecutedList) {
                    Log.i(TAG, "FutureExecutor executing Runnable: " + runnable);
                    VCEngine.getHandler().postDelayed(runnable, 10);
                    toBeExecutedList.remove(runnable);
                }
            } catch (Exception e) {
                Log.e(TAG, "FutureExecutor exception: ");
                e.printStackTrace();
            }
        }
    }

И я обнаружил, что удаляю элемент списка внутри цикла for. Это можно решить с помощью итератора или просто очистив список после цикла for. И теперь это работает.

0
ответ дан Danil.B 19 January 2019 в 19:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: