【发布时间】:2016-01-26 04:51:54
【问题描述】:
我知道有很多关于这个话题的问题,但是,我仍然对所提供的答案并不完全满意。
情况: 我使用 SurfaceHolder 在另一个线程中实现了 SurfaceView,就像开发人员指南中建议的那样:http://developer.android.com/guide/topics/graphics/2d-graphics.html
问题: 有时我会得到 java.lang.IllegalStateException: Surface has been released:
- 调用 SurfaceHolder.lockCanvas() 时
- 或在调用 SufraceHolder.unlockCanvasAndPost() 时
这意味着我的表面有时会在我锁定画布之前释放,有时 - 在锁定和解锁之间。
我的解决方案: 我在同步块中执行表面检查和锁定/解锁画布,所以我确定表面不会在这些操作之间被破坏。但是,我从未使用过同步块,我想问一下它是否有任何问题。到目前为止,代码运行良好,但您永远不知道什么时候会出现同步问题,所以我不完全相信这是最好的方法。
private class DrawingThread extends Thread{
@Override
public void run() {
super.run();
while (!isInterrupted() && holder != null) {
Canvas drawingCanvas = null;
synchronized (this) {
if (holder.getSurface().isValid()) {
drawingCanvas = holder.lockCanvas();
}
}
if (drawingCanvas != null && drawingCanvas.getWidth() > 0) {
drawThisView(drawingCanvas);
synchronized (this) {
if(holder.getSurface().isValid()) {
holder.unlockCanvasAndPost(drawingCanvas);
}
}
}
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if(drawingThread != null){
drawingThread.interrupt();
}
drawingThread = new DrawingThread();
drawingThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if(drawingThread.isInterrupted()){
drawingThread = new DrawingThread();
drawingThread.start();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
drawingThread.interrupt();
}
【问题讨论】:
标签: java android multithreading surfaceview synchronized