2014-01-12 54 views
0

我出現錯誤:「FATAL EXCEPTION:thread-186」在對代碼的這部分做了一些更改之後:我正在使用線程,surfaceHolder,surfaceView發生致命錯誤:已知並且無法找出它

public void run() { 
    long stepPerSecond=1000/FPS; 
    long startTime; 
    long sleepTime; 
    while(isRunning){ 
     turned=false; 
     Canvas c= null; 
     startTime=System.currentTimeMillis(); 
     try{ 
      prevStep=new Snake(snake); 
      c=this.getHolder().lockCanvas(); 
      synchronized (this.getHolder()) { 
       this.onDraw(c); 
       } 
     } 
     catch(Exception e){ 
     } 
     finally{ 
      if(c!=null&&!turned){ 
       this.getHolder().unlockCanvasAndPost(c); 
       } 
      if(turned){ 
       snake= new Snake(prevStep); 
       try{ 
        synchronized (this.getHolder()) { 
         this.onDraw(c); 
         } 
       } 
       catch(Exception e){ 
       } 
       finally{ 
        if(c!=null){ 
         this.getHolder().unlockCanvasAndPost(c); 
         turned=false; 
         } 
       } 
     } 
     sleepTime= stepPerSecond-(System.currentTimeMillis()-startTime); 
     if(sleepTime>0) 
      try { 
       Thread.sleep(sleepTime); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     else 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

    } 
    } 

} 

這裏是整體的一部分:

package com.example.snake; 

import java.util.ArrayList; 
import java.util.List; 


@SuppressLint("WrongCall") 
public class GameView1 extends SurfaceView implements Runnable { 

    private boolean isRunning=false; 
    private final long FPS=10; 

    private Bitmap bmp; 
    private SurfaceHolder holder; 
    private Thread gamethread; 
    //private int x=0; 
    //private long clickOnSprite; 
    Snake snake; 
    Snake prevStep; 
    boolean turned; 

    private List<Sprite> sprites=new ArrayList<Sprite>(); 

    public GameView1(Context context) { 
     super(context); 
     gamethread=new Thread(this); 
     holder= getHolder(); 

     holder.addCallback(new SurfaceHolder.Callback(){ 

      @Override 
      public void surfaceCreated(SurfaceHolder arg0) { 
       setRunning(true); 
       gamethread.start(); 

      } 

      @Override 
      public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) { 



      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder arg0) { 

       setRunning(false); 

       while(true){ 
        try { 
         gamethread.join(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 





      } 

    }); 
// bmp=BitmapFactory.decodeResource(getResources(), R.drawable.image); 
     snake=new Snake(20, 50, "RIGHT"); 

} 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 
     canvas.drawColor(Color.BLUE); 
     snake.onDraw(canvas); 
     //canvas.drawBitmap(bmp, x, 10, null); 
    } 
    /*public boolean onTouchEvent(MotionEvent event){ 
     if(System.currentTimeMillis()-clickOnSprite>300){ 
      clickOnSprite=System.currentTimeMillis(); 
      for (int i=0;i<sprites.size();i++){ 
       Sprite s=sprites.get(i); 
       synchronized (getHolder()) { 
        if(s.isCollition(event.getX(), event.getY())){ 
         sprites.remove(s); 
         break; 
        } 
        } 
     } 
     } 
     return true; 
    } 
    */ 
    @Override 
    public void run() { 
     long stepPerSecond=1000/FPS; 
     long startTime; 
     long sleepTime; 
     while(isRunning){ 
      turned=false; 
      Canvas c= null; 
      startTime=System.currentTimeMillis(); 
      try{ 
       prevStep=new Snake(snake); 
       c=this.getHolder().lockCanvas(); 
       synchronized (this.getHolder()) { 
        this.onDraw(c); 
        } 
      } 
      catch(Exception e){ 
      } 
      finally{ 
       if(c!=null&&!turned){ 
        this.getHolder().unlockCanvasAndPost(c); 
        } 
       if(turned){ 
        snake= new Snake(prevStep); 
        try{ 
         synchronized (this.getHolder()) { 
          this.onDraw(c); 
          } 
        } 
        catch(Exception e){ 
        } 
        finally{ 
         if(c!=null){ 
          this.getHolder().unlockCanvasAndPost(c); 
          turned=false; 
          } 
        } 
      } 
      sleepTime= stepPerSecond-(System.currentTimeMillis()-startTime); 
      if(sleepTime>0) 
       try { 
        Thread.sleep(sleepTime); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      else 
       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

     } 
     } 

    } 
    public void setRunning(boolean b){ 
     isRunning=b; 
    } 

    public boolean isTurned() { 
     return turned; 
    } 

    public void setTurned(boolean turned) { 
     this.turned = turned; 
    } 

} 

這裏的錯誤:

01-12 19:03:20.375: E/AndroidRuntime(6088): FATAL EXCEPTION: Thread-186 
01-12 19:03:20.375: E/AndroidRuntime(6088): java.lang.IllegalArgumentException 
01-12 19:03:20.375: E/AndroidRuntime(6088):  at android.view.Surface.nativeUnlockCanvasAndPost(Native Method) 
01-12 19:03:20.375: E/AndroidRuntime(6088):  at android.view.Surface.unlockCanvasAndPost(Surface.java:462) 
01-12 19:03:20.375: E/AndroidRuntime(6088):  at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:812) 
01-12 19:03:20.375: E/AndroidRuntime(6088):  at com.example.snake.GameView1.run(GameView1.java:138) 
01-12 19:03:20.375: E/AndroidRuntime(6088):  at java.lang.Thread.run(Thread.java:856) 
01-12 19:03:24.245: I/Process(6088): Sending signal. PID: 6088 SIG: 9 

我找不出WH當我在調試模式下,事件當我使用調試模式,沒有停止

回答

0

如果setTurned(boolean turned)方法得到的運行循環與真實參數中間叫(它通過它的方式 犯規發生錯誤並且它之前是錯誤的),您將嘗試再次解鎖畫布,導致該異常。我建議你切換到有一個隊列,你可以添加你的布爾變量,並從run循環開始從池中選擇項目,通過正確的同步(甚至更好的內部同步隊列)進行保護。

只需同步setTurned(boolean turned)方法不會解決您的問題。

相關問題