- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 onPause 发生时,我的线程没有停止,导致“线程已经启动”logcat 错误 onResume,因为我不能运行两个线程实例。此时如何终止线程?我相信我需要做类似的事情:
gameLoopThread.setRunning(false);
但是我不能将它添加到我的 balloonBasic onPause 中,我认为上下文是错误的。所以请帮助,代码如下所示。 (代码示例真的很有帮助,谢谢)
我的 Activity :
public class balloonBasic extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new GameViewBasic(this));
}
public void onResume() {
super.onResume();
SoundManager.getInstance();
SoundManager.initSounds(this);
SoundManager.loadSounds();
}
public void onPause() {
super.onPause();
//what do I put here?
}
}
我的表面 View :
public class GameViewBasic extends SurfaceView {
...abbreviated declarations...
private static SurfaceHolder holder;
private static GameLoopThreadBasic gameLoopThread;
public GameViewBasic(Context context) {
super(context);
gameLoopThread = new GameLoopThreadBasic(this);
holder = getHolder();
holder.addCallback(new Callback() {
public void surfaceDestroyed(SurfaceHolder holder)
{
gameLoopThread.setRunning(false);
}
public void surfaceCreated(SurfaceHolder holder) {
createSprites();
mapspritegraphics();
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
}
});
}
...abbreviated for brevity....
我的话题: 公共(public)类 GameLoopThreadBasic 扩展线程 { 私有(private) GameViewBasic View ; private volatile boolean running = false;
public GameLoopThreadBasic(GameViewBasic gameViewBasic) {
this.view = gameViewBasic;
}
public void setRunning(boolean run) {
running = run;
}
@Override
public void run() {
long ticksPS = 25; // =(1000/fps) ie 25ticksPS = 40fps
long startTime;
long sleepTime;
while (running) {
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} catch (Exception f) {} //
finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = (ticksPS - (System.currentTimeMillis() - startTime));
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
} catch (Exception e) {}
}
}
}
最佳答案
前段时间我在做一个游戏,我在早期阶段使用 LunarLander 作为灵感......但事实证明 LunarLander 示例代码实际上有那个错误(试图启动一个已经运行的线程) !下面是问题的解决方案,在扩展 SurfaceView 的类中。我在某个地方在线找到了解决方案,但我不记得在哪里,因为那是很久以前的事了。
public void surfaceCreated(SurfaceHolder holder)
{
if (mMyThreadName.getState() == Thread.State.TERMINATED)
{
mMyThreadName = new MyThreadName(xxx);
}
mSurfaceIsReady = true;
mMyThreadName.start();
}
请注意,我还调用了 mMyThreadName = new MyThreadName(xxx);在扩展 SurfaceView 的同一类的构造函数中。我认为我的 surfaceDestroyed 回调与 LunarLander 回调的工作方式相同,即。其中,mSurfaceIsReady 被设置为 false。
编辑
Android IllegalThreadStateException in LunarLander
看起来可能有比我上面发布的代码更好的解决方案。相反,可能总是只在 surfaceCreated 中实例化线程,而不检查它是否已终止,并且不要在其他任何地方实例化它。不过,我还没有尝试过第二种方法!
如果我很抱歉,我可能误解了你的问题。
关于android - 如何最好地暂停和恢复 surfaceView 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381411/
我是一名优秀的程序员,十分优秀!