Решение, которое поменяет ваш код как минимум, должно состоять в том, чтобы изменить каждый вызов 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 .
Редактировать: добавлена ссылка на вопрос по модулю.
Итак, сама идея неплохая, это был просто мой тупой мозг 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. И теперь это работает.