2013-04-02 3 views
1

그리기 응용 프로그램에 문제가 있습니다. 드로잉 액티비티를 종료 할 때 아래와 같은 오류가 발생합니다 (예 : 반환 버튼 포함). 나는 게시물을 보았지만 아무것도 도움이되지 않습니다. 잠시 동안 작동하도록 노력했기 때문에 제 도면 표면 작업을 살펴볼 수 있다면 많은 의미가 있습니다! 고마워요 :)표면 그리기, unlockCanvasAndPost 및 IllegalArgumentException

오류 : 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) 

홈페이지 코드 :

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

가 나는 것을 추측 할 lockCanvas 예외가 발생하여 canvas이 null로 설정되었습니다. 예외가 finally 절에 실행을 보냈는데,이 예외는 unlockCanvasAndPost을 호출하여 새로운 예외가 발생했습니다. 새로운 예외는 오래된 것을 가렸다.

은 (이것은 4.3의 버그처럼 조금 보이지만, 4.3 밖으로 오기 전에이 게시했습니다.) 나는 다른 개발자 내가 온 버그를 우회하는 방법을 4.3에서 잠시 읽은 후 비슷한 문제가 있었다

+1

4.3에서이 버그를 해결하는 방법에 대한 아이디어가 있으십니까? –

+1

이것은 앱 버그 일 수 있습니다. 확실히하려면 초기 예외를 확인해야합니다. 어떤 경우 4.3 이전 버전 인 경우 https://code.google.com/p/android/issues/detail?id=58385와 관련이 없습니다. – fadden

+0

@fadden을 돌보는 사람이라면 누구나 옳다. 그 버그는 여전히 Android 최신 업데이트에서 수정되지 않았다. –

1

이에. 명심해야 할

단계 : 다음 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); 
      } 
     } 
    } 
} 

누군가에게 도움이되기를 바랍니다. ;)