public class GameView extends SurfaceView {
public GameView(Context context) {
super(context);
getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
synchronized (this) {
renderThread = new Thread(() -> {
while (!Thread.interrupted()) {
try {
Canvas canvas = surfaceHolder.lockCanvas();
canvas.drawARGB(255, 255, 0, 0);
surfaceHolder.unlockCanvasAndPost(canvas);
} catch (Exception e) {
e.printStackTrace();
}
}
});
renderThread.start();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int width, int height, int format) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
synchronized (this) {
renderThread.interrupt();
try {
renderThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Thread renderThread;
});
}
}
我想在线程中使用SurfaceView绘制一些东西。
我在创建曲面后创建一个新的渲染线程,并在表面被破坏时终止渲染线程。
但有时renderThread
在表面被破坏时终止并且线程将进入无限循环。
Thread.interrupted()
后, renderThread.interrupt()
仍然返回false。
看起来renderThread.interrupt()
不起作用。
为什么?
答案 0 :(得分:0)
当调用中断没有设置中断标志时,你可能碰过这种情况。
如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long)时阻塞了这个线程,int),sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。
我建议你检查你的代码(或你所依赖的代码)是否在某个地方捕获InterruptedException以确认或否认我的怀疑。
顺便说一句。还有很多其他的可能性可以清除中断的标志(例如调用#interrupted it self ...)所以我建议你在while check子句中使用其他东西以防止失去对它的控制。
答案 1 :(得分:0)
不要抓住Exception
。抓住您期望的异常,并知道如何处理。你可以捕获InterruptedException
,在某些情况下可以抛出而不是设置中断标志