4

这可能是一个简单的回答,但我似乎无法正确回答并认为我会问。我得到一个 java.lang.IllegalArgumentException 和一个 java.lang.NullPointerException

这是错误日志

 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

对此的任何帮助将不胜感激。先感谢您。

4

2 回答 2

1

您将 null 传递给SurfaceHolder.lockCanvas. 您想改用无参数版本lockCanvas(),假设您没有要被视为脏的矩形。

于 2012-03-20T18:13:13.937 回答
0

保存boolean您的Canvas实例是否已被锁定,以避免在您从先前的调用中解锁unockCanvasAndPost()之前执行该方法:CanvaslockCanvas()

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;
        }
    }
}
于 2014-12-22T16:20:12.057 回答