绘图表面,unlockCanvasAndPost和IllegalArgumentException

时间:2013-04-02 17:31:07

标签: java android post android-canvas unlock

我的绘图应用程序有问题。我离开绘图活动时会出现以下错误(例如,返回按钮)。我看过这些帖子,但似乎没有什么能帮助我。如果你能看一下我的绘图表面活动,那将意味着很多,因为我一直试图让它工作一段时间!非常感谢:)

错误:

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...
        }
    }
}

2 个答案:

答案 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);
            }
        }
    }
}

我希望这可以帮助别人。 ;)