在我的应用程序中,我有一个线程正在从文件中读取数据。该线程还同时使用诸如“正在读取对象1的204”,“正在加载背景图像”之类的文本来更新“状态”字符串。
在主应用程序线程中,显示一个文本Label,它在每个框架中从加载线程中检索此状态String,并将其显示给用户,以便他们知道进度。
我认为,问题出在某种程度上是线程化的,因为(很少)在渲染之前设置其文本时,文本Label发生崩溃。我感觉它正在获取两个不同的文本值,并且数组索引超出范围-就是崩溃了。
加载线程:
// ...loading some stuff
setSavingOpeningStatusText("loading stuff 1");
// ...loading different stuff
setSavingOpeningStatusText("loading stuff 2");
// ...etc
setSavingOpeningStatusText("loading stuff 3);
主应用程序线程,在呈现之前进行每次update()时:
statusLabel.setText(loadingThread.getSavingOpeningStatusText());
这是加载线程中的这两个get / set函数:
public synchronized String getSavingOpeningStatusText()
{
return savingLoadingStatusString;
}
private synchronized void setSavingOpeningStatusText(String text)
{
savingLoadingStatusString = text;
}
我认为,同步函数是设置/获取此String值的唯一方法,可以解决问题,但没有。
我在上面做错什么了吗,还是我在寻找错误的位置以找出这次崩溃?
编辑,实际崩溃:
因此,每隔一帧在Label上调用一次:
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)
绘制框架时,在Label上调用layout()
,该标签将计算大小,而由于已经分配了新的文本,所以不进行计算。这是整个应用程序中无数这样的唯一崩溃的标签。再次,这是非常罕见的,这就是让我认为它的线程相关的原因,即使它的某些Pool崩溃了(我认为它正试图从一个Pool中获取一定数量的字形,但是由于String在改变,这个数字在中途改变了。跨线程?)。