有一个带有 SurfaceView 的活动和一个要在其上绘制的线程(来自此示例(。以下是GameSurface的定稿代码:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while(retry) {
try {
this.gameThread.setRunning(false);
this.gameThread.join();
}catch(InterruptedException e) {
e.printStackTrace();
}
retry = true;
}
}
(不太明白重试总是正确的逻辑,放了一点,但没有积极的影响(
这是游戏线程:
package org.mineprogramming.laserminigolf;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;
import java.util.logging.Logger;
public class GameThread extends Thread {
private boolean running;
private GameSurface gameSurface;
private SurfaceHolder surfaceHolder;
public GameThread(GameSurface gameSurface, SurfaceHolder surfaceHolder) {
this.gameSurface = gameSurface;
this.surfaceHolder = surfaceHolder;
}
@Override
public void run() {
long startTime = System.nanoTime();
while(running) {
Canvas canvas= null;
try {
// Get Canvas from Holder and lock it.
canvas = this.surfaceHolder.lockCanvas();
// Synchronized
synchronized (canvas) {
this.gameSurface.update();
this.gameSurface.draw(canvas);
}
}catch(Exception e) {
// Do nothing.
} finally {
if(canvas!= null) {
// Unlock Canvas.
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}
long now = System.nanoTime() ;
// Interval to redraw game
// (Change nanoseconds to milliseconds)
long waitTime = (now - startTime)/1000000;
if(waitTime < 10) {
waitTime= 10; // Millisecond.
}
System.out.print(" Wait Time="+ waitTime);
try {
// Sleep.
this.sleep(waitTime);
} catch(InterruptedException ignored) { }
startTime = System.nanoTime();
System.out.print(".");
}
}
public void setRunning(boolean running) {
this.running= running;
}
}
现在我开始一些其他活动:
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
并且此活动没有响应(但是显示(。 也尝试启动它以获得结果。 通过 finish(( 从我的 SurfaceView 活动返回到另一个活动时,情况也是如此。
调试了一会儿后,我看到活动的初始化成功,稍后在某个地方冻结
好的,就是这样。重试始终为真。这种最终确定的变体帮助了我:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while(retry) {
try {
this.gameThread.setRunning(false);
this.gameThread.join();
retry = false;
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
不确定它是最好的,但它对我有用。