我的绘图应用程序有问题。我离开绘图活动时会出现以下错误(例如,返回按钮)。我看过这些帖子,但似乎没有什么能帮助我。如果你能看一下我的绘图表面活动,那将意味着很多,因为我一直试图让它工作一段时间!非常感谢:)
错误:
03-25 13:41:36.760: E/AndroidRuntime(6642): FATAL EXCEPTION: Thread-423
03-25 13:41:36.760: E/AndroidRuntime(6642): java.lang.IllegalArgumentException
03-25 13:41:36.760: E/AndroidRuntime(6642): at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
03-25 13:41:36.760: E/AndroidRuntime(6642): at android.view.Surface.unlockCanvasAndPost(Surface.java:457)
03-25 13:41:36.760: E/AndroidRuntime(6642): at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:812)
03-25 13:41:36.760: E/AndroidRuntime(6642): at com.ecp.drawing.DrawingSurface$DrawThread.run(DrawingSurface.java:80)
DrawingSurface的主要代码:
public void run() {
Canvas canvas = null;
while (_run){
if(isDrawing == true){
try{
canvas = mSurfaceHolder.lockCanvas(null);
if(mBitmap == null){
mBitmap = Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);
}
final Canvas c = new Canvas (mBitmap);
c.drawColor(0, PorterDuff.Mode.CLEAR);
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
commandManager.executeAll(c,previewDoneHandler);
previewPath.draw(c);
canvas.drawBitmap (mBitmap, 0, 0,null);
} finally {
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
已经有表面破坏功能:
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// we will try it again and again...
}
}
}
答案 0 :(得分:2)
我猜测lockCanvas
引发了一个异常,将canvas
设置为null。异常将执行发送到调用finally
的{{1}}子句,该子句抛出了新的异常。新的例外模糊了旧的。
(这看起来有点像4.3中的错误,但这是在4.3出来之前发布的。)
答案 1 :(得分:1)
我在4.3中遇到过类似的问题,在阅读了一段时间之后,其他开发人员如何绕过我遇到的错误
。要记住的步骤: lockCanvas ,绘制,然后 unlockCanvas 。
/**
* Note: The drawing thread doesn't loop, it just runs once and exits
*/
@Override
public void run() {
/* This should never happen but just to be sure... */
if (mSurfaceHolder == null || mSurfaceView == null) {
return;
}
/**
* In order to work reliable on Nexus 7, we place ~500ms delay at the start of drawing thread
* (AOSP - Issue 58385)
*/
if (android.os.Build.BRAND.equalsIgnoreCase("google") &&
android.os.Build.MANUFACTURER.equalsIgnoreCase("asus") &&
android.os.Build.MODEL.equalsIgnoreCase("Nexus 7")) {
Log.w(this, "Sleep 500ms (Device: Asus Nexus 7)");
try {
Thread.sleep(500);
} catch (InterruptedException ignored) {
}
}
Canvas canvas = null;
while (mRunning) {
try {
Surface surface = mSurfaceHolder.getSurface();
/* Check availability of surface */
if (surface != null && surface.isValid()) {
canvas = mSurfaceHolder.lockCanvas();
synchronized (mSurfaceHolder) {
if (canvas != null) {
//TODO call drawing code
}
}
}
} catch (Exception e) {
Log.e(TAG, "[Drawing Thread]", e);
} finally {
/**
* Do this in a finally so that if an exception is thrown during the above,
* we don't leave the Surface in an inconsistent state
*/
if (canvas != null && mSurfaceHolder != null) {
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
我希望这可以帮助别人。 ;)