3

描画アプリケーションに問題があります。描画アクティビティを終了すると (たとえば、戻るボタンを使用して)、以下のエラーが発生します。投稿を見ましたが、何も役に立たないようです。私の drawingsurface アクティビティを見ていただければ幸いです。しばらくの間、それを機能させようとしてきたからです。どうもありがとう :)

エラー :

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

2 に答える 2

2

私は 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);
            }
        }
    }
}

これが誰かを助けることができることを願っています。;)

于 2015-02-25T19:49:35.310 に答える
2

nullに設定されlockCanvasたままの例外がスローされたと思います。例外は、新しい例外をスローしたを呼び出した句にcanvas実行を送信しました。新しい例外は古いものを覆い隠しました。finallyunlockCanvasAndPost

(これは 4.3 のバグのように見えますが、これは 4.3 がリリースされる前に投稿されたものです。)

于 2013-08-23T19:48:29.170 に答える