Получение строки из другого потока с периодическими сбоями - PullRequest
0 голосов
/ 09 января 2019

В моем приложении есть поток, который читает данные из файла. Этот поток также одновременно обновляет строку «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(), где он вычисляет размер и еще много чего из-за нового текста, которому он был назначен. Это единственная метка, которая вылетает, как эта, из бесчисленных в приложении. И опять же, это очень редко, именно это заставляет меня думать, что его многопоточность связана, даже если какой-то пул вылетает (я думаю, что он пытается извлечь определенное количество глифов из пула, но это число меняется на полпути, потому что меняется строка через темы?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...