【发布时间】:2014-02-25 08:20:22
【问题描述】:
我正在尝试创建一个简单的背景渲染,顶部有一张图像,大约每 30 秒更新一次。我正在使用画布来完成这项工作,但是当我尝试打印到画布上时,它会抛出 NPE。据我所知,画布已经初始化。活动启动视图,该视图启动/停止运行绘图方法的线程。 NPE 是在 draw 方法中抛出的。这是启动这一切的活动:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = new GameView(this);
setContentView(view);
view.onCreate();
}
public void onPause() {
super.onPause();
view.onPause();
}
public void onResume() {
super.onResume();
view.onResume();
}
这些是我的 Surface View 的主要功能:
public GameView(Context context) {
super(context);
getHolder().addCallback(this);
setFocusable(true);
}
public void onCreate() {
_drawThread = new DrawThread(getHolder(), this);
}
synchronized public void draw(Canvas canvas) {
canvas.getHeight(); //returns NPE
}
public void onResume() {
if (!_drawThread.isAlive()) {
_drawThread.setRunning(true);
_drawThread.start();
} else {
_drawThread.setRunning(true);
}
}
public void onPause() {
boolean retry = true;
_drawThread.setRunning(false);
while (retry) {
try {
_drawThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
我的绘图线程看起来像:
public void run() {
Canvas c;
while (_running) {
c = null;
try {
c = _surfaceHolder.lockCanvas();
synchronized (_surfaceHolder) {
_game.draw(c);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
据我所知,画布在创建导致 NPE 的绘制线程之前没有被初始化,但我看不出代码有什么问题。一点帮助或建议会很棒。
【问题讨论】:
-
画布必须为null,_surfaceHolder.lockCanvas()返回什么?