2015-05-14 2 views
0

Im, делающий игру, цель которой - убить зомби и обновить ваше оружие. Но у меня проблема, когда я пытаюсь приостановить свою игру и пойти в магазин, у меня нет проблем, но когда я пытаюсь вернуться к игре - Крушение приложения. вот код:Обратно к SurfaceView от другого предпринимательства

public GameView(Context context) { 
     super(context); 
     gameLoopThread = new GameLoopThread(this); 

     getHolder().addCallback(new SurfaceHolder.Callback() { 

       @Override 
       public void surfaceDestroyed(SurfaceHolder holder) { 
         boolean retry = true; 
         gameLoopThread.setRunning(false); 

         while (retry) { 
           try { 
            gameLoopThread.join(); 
            retry = false; 
           } catch (InterruptedException e) {} 
         } 
       } 

       @Override 
       public void surfaceCreated(SurfaceHolder holder) { 
         //createSprites(); 

         gameLoopThread.setRunning(true); 
         gameLoopThread.start(); 
         thread1.start(); 
         thread_level.start(); 
         wielkosc_czcionki=getWidth()/25; 

       } 

       @Override 
       public void surfaceChanged(SurfaceHolder holder, int format, 
           int width, int height) { 
       } 
     });    
@SuppressWarnings("deprecation") 
     void pause(){ 


     if (!is_game) // is not running 
     { 
        paused=!paused; 
        is_game=!is_game; 
      } 
      else{ // is running 
       is_game=!is_game; 
       paused=!paused; 
       startuj_sklep(); 
       //startuj_sklep(); 
      } 

     } 
     Thread thread_level = new Thread(){ 
     public void run(){ 
      while(true){ 
      if(akt_zabit%(int)level_zabit==0){ 
      level++;  
      level_zabit=level_zabit*1.5; 
      resp_time=resp_time-20; 
      pause(); 


      } 

      } 
     } 

     };  


void startuj_sklep(){ 

    Context context = getContext(); // from MySurfaceView/Activity 
    Intent intent = new Intent(context, Sklep.class); 
    int tab[]={dolary,zycie_gracza_akt,zycie_gracza_def,poj_mag,szybkosc_strzalu, reload_time_def}; 
    intent.putExtra("dane", tab); 
    context.startActivity(intent); 

} 

Так что «пауза» метод делает всю игру останавливают, а затем его использование «startuj_sklep» (Engish: start_shop). Метод startuj_sklep начинает новую активность. и его поворот нового действия, но когда он падает.

  back.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       finish(); 

      } 
     }); 

05-14 15: 48: 52,031: Е/AndroidRuntime (тысяча двести семьдесяты две): неустранимый: Основной 05-14 15: 48: 52,031: Е/AndroidRuntime (тысяча двести семьдесят две): java.lang. IllegalThreadStateException: уже начат поток 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at java.lang.Thread.checkNotStarted (Thread.java:871) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на java.lang.Thread.start (Thread.java:1025) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): у Morisson.zombieapocalypse.GameView $ 3.surfaceCreated (GameView.java: 149) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на android.view.SurfaceView.updateWindow (поверхность View.java:571) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.SurfaceView.onWindowVisibilityChanged (SurfaceView.java:232) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.View.dispatchWindowVisibilityChanged (View.java:7682) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.ViewGroup.dispatchWindowVisibilityChanged (ViewGroup.java: 1071) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.ViewGroup.dispatchWindowVisibilityChanged (ViewGroup.java:1071) 05-14 15: 48: 52.031: E/AndroidRuntime (1272) : at android.view.ViewGroup.dispatchWindowVisibilityChanged (ViewGroup.java:1071) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1227) 05 -14 15: 48: 52.031: E/AndroidRuntime (1 272): at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1004) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java: 5481) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на android.view.Choreographer $ CallbackRecord.run (Хореограф.ява: 749) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на android.view.Choreographer.doCallbacks (Хореограф.java:562) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на android.view.Choreographer.doFrame (Хореограф.java:532) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.ява: 735) 05-14 15: 48: 52.031: E/AndroidRuntime (1272) : at android.os.Handler.handleCallback (Handler.java:730) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.os.Handler.dispatchMessage (Handler.java:92) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.os.Looper.loop (Looper. java: 137) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at android.app.ActivityThread.main (ActivityThread.java:5103) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at java.lang.reflect.Method.invokeNative (собственный метод) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at java.lang.reflect.Method.invoke (Method.java:525)) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:737) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:553) 05-14 15: 48: 52.031: E/AndroidRuntime (1272): at dalvik.system.Nati veStart.Основной (Native Method)

ответ

0

surfaceCreated() обратного вызова в анонимном классе в GameView пытается запустить поток, который уже запущен, так что вы получаете

java.lang.IllegalThreadStateException: Thread already started 

Добавьте протоколирование, чтобы увидеть, когда обратные вызовы запускаются и когда ваш поток запускается и останавливается. Это даст вам лучшее представление о том, как ваше приложение взаимодействует с системой.

Вы также можете найти this article.

(я не знаю, если это часть проблемы, но я настоятельно рекомендую против сделать свой pause() метод выступать в качестве переключателя. Вы всегда должны знать, вызов pause(), ожидается ли приостановить или возобновить, и писать его поскольку переключение создает ненужную двусмысленность. Если игра приостановлена, и вы пытаетесь приостановить ее второй раз, вы должны проигнорировать второй запрос или сообщить об ошибке, а не пытаться возобновить его.)

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

  • Нет связанных вопросов^_^