我编写了一个应用程序,我想在更高的 API 级别上进行测试以检查兼容性。对于 API 10 (2.3.3) 没有问题,但是当我在 API 15 (4.0.3) 上运行我的应用程序时,当我退出 Activity 时,我的一个 SurfaceViews 中出现了 NullPointerException。我不得不说我解决了这个问题,但我无法弄清楚为什么异常实际上会发生。所以也许你可以告诉我。
这是在 API 10 上为我工作的代码:它是run()
-method 的通用结构。
public void run() {
while (mThreadActive) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if(mState == 1) {
updateValues();
updateAnimation();
}
doDraw(c);
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
退出活动时在 API 15 上:当doDraw()
-method 尝试在“c”上写入时发生异常。我检查了 c 并发现它是空的,所以我得到一个异常也就不足为奇了。我还检查mThreadActive
并发现虽然我将其设置为 false,但while
-loop 仍然会触发。这是代码示例:
public void run() {
while (mThreadActive) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if(mState == 1) {
updateValues();
updateAnimation();
}
if(!mThreadActive) // so it really is!
Log.d("Thread", "mThreadActive is false!");
if(c == null) // so it is too!
Log.d("Thread", "c is null!");
doDraw(c); // error
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
我可以想象为什么在被-statementmThreadActive
检查后会变为 false ,但我无法弄清楚为什么 "c" 在. 似乎代码没有按顺序运行。while
mSurfaceHolder.lockCanvas(null)
好吧,解决方案将c != null
在绘制之前进行检查:
public void run() {
while (mThreadActive) {
c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if(mState == 1) {
updateValues();
updateAnimation();
}
if(c != null) // prevent drawing on c if c doesnt exist.
doDraw(c);
}
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
那么为什么我在 API 15 上得到一个异常,而它在 API 10 上运行良好?另一个有趣的事情是,我有其他结构相同的 SurfaceView,但与这个相比,它们工作得很好!为什么代码不按顺序运行?是因为我正在模拟器上进行测试(这非常滞后)吗?
谢谢你。