标签:thread-safety surfaceview android
我正在使用LunarLander API演示开发适用于Android的RPG.我已经使用此演示制作了一个游戏(《豪猪刺客》,快来看看!),因此我对Canvas类和类似的东西有了很好的了解.
我的问题是,在RPG中,您需要一种访问库存,统计信息等的方法.因此,我将BACK按钮设置为启动Inventory.java类.我在完成()库存活动并尝试返回游戏(SurfaceView)时遇到问题.
这是SurfaceCreated()回调:
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
我收到由“ IllegalThreadStateException:线程已启动”引起的FC,因此我在SurfaceCreated()回调中添加了try / catch.使用try / catch时,没有FC发生,但是我返回了黑屏.
我试过尝试/赶上并在开头添加了一个检查:if(!thread.isAlive()).这样,如果线程已经启动,它将不会执行任何操作.奇怪的是,我得到了相同的FC“线程已启动”,因此thread.isAlive()必须返回false.
我也有API的onWindowFocusChanged()方法:
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (!hasWindowFocus) thread.pause();
else thread.setState(STATE_RUNNING);
}
我非常热衷于游戏,我为RPG奠定了大部分基础.但是,所有这些Android / Java东西都困扰着我.谁能指出我正确的方向?
解决方法:
这是因为您尝试重新启动终止的线程,因此.IsAlive()返回false.如果您用Google搜索LunarLander错误或非法线程之类的东西,有很多关于此问题的文档.
我发现一种可能的解决方法是:
public void surfaceCreated(SurfaceHolder holder) {
if (thread.getState() == Thread.State.TERMINATED) {
thread = new CascadeThread(getHolder(), getContext(), getHandler());
thread.setRunning(true);
thread.start();
}
else {
thread.setRunning(true);
thread.start();
}
您可以找到完整的文档here
标签:thread-safety,surfaceview,android 来源: https://codeday.me/bug/20191105/1997493.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。