В моем приложении есть поток, который читает данные из файла. Этот поток также одновременно обновляет строку «status» с текстом типа «Чтение объекта 1 из 204», «Загрузка фонового изображения» и т. Д.
В главном потоке приложения отображается текстовая метка, и каждый фрейм извлекает эту строку состояния из потока загрузки и отображает ее пользователю, чтобы они знали, как происходит процесс.
Я думаю проблема заключается в том, что многопоточность, потому что (редко) происходит сбой в текстовой метке, когда он устанавливает свой текст перед рендерингом. Я чувствую, что он получает два разных значения текста и индекс массива выходит за границы - дело в том, что он падает.
Загрузка темы:
// ...loading some stuff
setSavingOpeningStatusText("loading stuff 1");
// ...loading different stuff
setSavingOpeningStatusText("loading stuff 2");
// ...etc
setSavingOpeningStatusText("loading stuff 3);
Главный поток приложения , при каждом обновлении () до рендеринга:
statusLabel.setText(loadingThread.getSavingOpeningStatusText());
И вот эти две функции get / set в потоке загрузки:
public synchronized String getSavingOpeningStatusText()
{
return savingLoadingStatusString;
}
private synchronized void setSavingOpeningStatusText(String text)
{
savingLoadingStatusString = text;
}
Я думал, что синхронизированная функция как единственный способ установки / получения значения этой строки решит проблему, но это не так.
Я что-то не так делаю выше, или я смотрю не в том месте, чтобы выяснить это падение?
Редактировать, фактический сбой:
Опять же, это называется на метке каждый кадр:
statusLabel.setText(loadingThread.getSavingOpeningStatusText());
А потом, когда происходит рисование:
Fatal Exception: java.lang.IllegalStateException
Array is empty.
com.badlogic.gdx.utils.Array.pop (Array.java:323)
com.badlogic.gdx.utils.Pool.obtain (Pool.java:51)
com.badlogic.gdx.graphics.g2d.GlyphLayout.setText (GlyphLayout.java:143)
com.badlogic.gdx.scenes.scene2d.ui.Label.layout (Label.java:214)
...(bunch of stuff)
*.*.*.App.render (App.java:595)
Когда нарисован фрейм, на Метке вызывается layout()
, где он вычисляет размер и еще много чего из-за нового текста, которому он был назначен. Это единственная метка, которая вылетает, как эта, из бесчисленных в приложении. И опять же, это очень редко, именно это заставляет меня думать, что его многопоточность связана, даже если какой-то пул вылетает (я думаю, что он пытается извлечь определенное количество глифов из пула, но это число меняется на полпути, потому что меняется строка через темы?).