Работает, как и ожидалось, у вас есть поток приложения и поток задач, они выглядят примерно так:
App ------\ ----------------------
Task \-label.setText() Exception
Вы не можете работать с любым пользовательским интерфейсом ни на чем, кроме потока приложения, поэтомудобавление вашего RunLater делает это:
App ----\ -------------/ RunLater(label.setText()) ----------
Task \-add to list/
, что хорошо работает.Есть несколько способов управлять этим в зависимости от того, что вы хотите сделать:
- Если вы хотите обновить список таблиц в задаче, вы можете переместить вызов RunLater внутрь задачи, а невнутри обработчика, таким образом он все равно вернет вас к ветке приложения.Таким образом, если вы на самом деле находитесь в потоке приложения, нет необходимости вызывать RunLater в обработчике.
App ---\ -----------------------/ label.setText() ----------
Task \-RunLater(add to list)/
- Другой вариант - просто использовать Task>, который будет запускатьсяв другом потоке и вернуть полный список строк, которые будут добавлены.Это, скорее всего, то, что вам нужно, если вы выполняете сетевые вызовы в задаче, получаете список элементов, а затем добавляете их, как только они все загружены в таблицу.
App -----\ ------------------------------/ label.setText() ---/ add to table list-------
Task \-build list, update progress /- return final list /
Надеюсь, форматирование останется.