4

이것은 아마도 간단한 대답 일지 모르지만 나는 옳은 것처럼 보이지 않아서 물어볼 것이라고 생각했습니다. 내가 java.lang.IllegalArgumentException를하고 java.lang.NullPointerException이 여기안드로이드 java.lang.IllegalArgumentException

을 얻고 여기에 오류 로그

03-20 13:13:22.872: E/SurfaceTextureClient(565): dequeueBuffer failed (No such device) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): Exception locking surface 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): java.lang.IllegalArgumentException 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at android.view.Surface.lockCanvasNative(Native Method) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at android.view.Surface.lockCanvas(Surface.java:76) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at com.android.internal.view.BaseSurfaceHolder.internalLockCanvas(BaseSurfaceHolder.java:184) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at com.android.internal.view.BaseSurfaceHolder.lockCanvas(BaseSurfaceHolder.java:161) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at ca.watercity.CityActivity$Blimp.render(CityActivity.java:235) 
03-20 13:13:22.879: E/BaseSurfaceHolder(565): at ca.city.CityActivity$CityThread.run(CityActivity.java:580) 
03-20 13:13:22.879: W/dalvikvm(565): threadid=11: thread exiting with uncaught exception (group=0x409c01f8) 
03-20 13:13:22.889: E/AndroidRuntime(565): FATAL EXCEPTION: Thread-79 
03-20 13:13:22.889: E/AndroidRuntime(565): java.lang.NullPointerException 
03-20 13:13:22.889: E/AndroidRuntime(565):  at ca.city.CityActivity$Blimp.render(CityActivity.java:237) 
03-20 13:13:22.889: E/AndroidRuntime(565):  at ca.city.CityActivity$CityThread.run(CityActivity.java:580) 


03-20 13:26:12.633: E/AndroidRuntime(564): java.lang.NullPointerException 

이다가 초래있어 두 줄의 코드입니다.

public void render(){ 
      Canvas canvas = null; 
      try{ 
       // line 235 
       canvas = this._surfaceHolder.lockCanvas(null); 
       synchronized (this._surfaceHolder) { 
        canvas.save(); 
        this.onDraw(canvas); 
        canvas.restore(); 
       } 
      }finally{ 
       if(canvas != null){ 
        this._surfaceHolder.unlockCanvasAndPost(canvas); 
       } 
      } 
     } 

및이 코드 라인.

@Override 
     public void run() { 
      while(this._running){ 
       this._blimp.render(); 
      } 
     } // line 580 

위의 사항에 큰 도움이 되었으면 도움이 될 것입니다. 미리 감사드립니다.

답변

1

null을 SurfaceHolder.lockCanvas으로 전달 중입니다. lockCanvas()의 no 인수 버전을 대신 사용하려는 경우, 더럽지 않게 취급하려는 rect가 없다고 가정하십시오.

+0

에 http : // 개발자. android.com/reference/android/view/SurfaceHolder.html#lockCanvas%28%29 – jjm

+0

null 예외를 제거 했는데도 동일한 두 줄의 코드에서 java.lang.IllegalArgumentException 오류가 발생했습니다. 그 오류의 원인을 잘 모르겠지만, 이건 안드로이드 4에서 일어난다 고 언급해야합니다. 아래의 내용은 아무 문제가 없으며 단지 안드로이드 4 이상을 일으킬 것입니다. 어쩌면 그 버전과 관련이 있습니다. – user870286

+0

나중에 그 별난 사람, 내가 그것을 주셔서 감사 드리며 문제의 절반을 없애 주셔서 감사합니다, 나는 누군가에게이 문제에 대한 답변이없는 한 대답을 찾으면 계속 게시 할 것입니다. – user870286

0

저장에 boolean 당신의 Canvas 인스턴스가 이미 잠겨 있는지 여부 또는 Canvas 전에 unockCanvasAndPost() 방법의 실행을 방지하기 위해 이전 lockCanvas() 호출에서 잠금을 해제하지 :

private boolean canvasLocked; 

public void render() { 
    Canvas canvas = null; 
    try { 
     // line 235 
     if (!canvasLocked) { 
      canvas = this._surfaceHolder.lockCanvas(null); 
      canvasLocked = true; 
      synchronized (this._surfaceHolder) { 
       canvas.save(); 
       this.onDraw(canvas); 
       canvas.restore(); 
      } 
     } 
    } finally { 
     if (canvas != null) { 
      this._surfaceHolder.unlockCanvasAndPost(canvas); 
      canvasLocked = false; 
     } 
    } 
} 
관련 문제