java - 从另一个线程中检索字符串,导致周期性崩溃
问题描述
在我的应用程序中,我有一个线程正在从文件中读取数据。该线程还同时使用“正在读取 204 的对象 1”、“正在加载背景图像”等文本更新“状态”字符串。
在主应用程序线程中,会显示一个文本标签,并且每个帧都会从加载线程中检索此状态字符串并将其显示给用户,以便他们知道进度。
我认为问题是线程,不知何故,因为(很少)在文本标签中发生崩溃,而它在渲染之前设置其文本。我觉得它得到了两个不同的文本值,并且数组索引超出了界限 - 关键是它正在崩溃。
加载线程:
// ...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;
}
我认为同步函数作为设置/获取此字符串值的唯一方法可以解决问题,但事实并非如此。
我在上面做错了什么,还是我在错误的地方寻找这个崩溃?
编辑,实际崩溃:
因此,每帧都会在 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)
绘制框架时,layout()
在 Label 上调用它来计算大小等等,因为它已经分配了新的文本。这是整个应用程序中无数标签中唯一一个像这样崩溃的标签。再一次,非常罕见,这让我认为它的线程相关,即使它的一些池崩溃了(我认为它试图从池中获取一定数量的字形,但是这个数字在中途发生了变化,因为字符串正在改变跨线程?)。
解决方案
推荐阅读
- oauth-2.0 - oauth2 隐式流的理想过期时间是多少
- c++ - 在共享指针向量中按值擦除
- linux - 无法打开共享对象文件:没有这样的文件或目录 [在 VM 上安装 FSL]
- python - 在不获取的情况下获取 MySQL 游标行数
- python - 按不同范围的因素加权多列
- angular - Angular 6 错误处理 - 如何在模态中显示错误?
- actionscript-3 - 图像重叠 - 动作脚本 3 / adobe flash / adobe animate
- javascript - 无法在不刷新页面并重试 ES6 的情况下删除新创建的列表项
- java - 带有数组字符串主体的 JAVA 删除 API
- javascript - 如何在 Windows 10 上的电子应用程序中禁用键盘快捷键 Alt + Tab?