2014-01-12 5 views
0

У меня есть ошибка: «FATAL EXCEPTION: thread-186» после того, как я внесли некоторые изменения в эту часть кода: i amd using thread, surfaceHolder, surfaceViewИмея фатальную ошибку: anared и can not вычисляют ее

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 

я не могу понять, ВГ у него это кстати ошибка не случается, когда я нахожусь в режиме отладки, событие, когда я использую режим отладки, без остановок

ответ

0

Если setTurned(boolean turned) метода вызывается в середине цикла выполнения с истинным параметром (и раньше это было неверно), вы попытаетесь разблокировать холст второй раз, что приведет к этому исключению. Я бы предложил вам переключиться на очередь, в которую вы добавляете свои булевы, и выбирать элементы из пула в начале цикла run, защищенные надлежащей синхронизацией (даже лучше, с внутренней синхронизацией).

Просто синхронизация метода setTurned(boolean turned) не решит вашу проблему.

Смежные вопросы