Как предотвратить «IllegalStateException» при использовании фрагментов - PullRequest
0 голосов
/ 02 июля 2019

В настоящее время я программирую игровое приложение для тусовочной игры "Оборотни Миллерс Холлоу".Когда какой-либо персонаж в игре должен принять решение, создается новый фрагмент со всей необходимой информацией. Все это прекрасно работает, пока я не запускаю игру во второй раз, а затем при первом коммите выдается IllegalStateException.

Я уже пытался использовать commitAllowingStateLoss(), но это приводит только к невидимому интерфейсу.Удаление всех фрагментов из менеджера фрагментов также не помогло.

Мое приложение запускается с основным действием в качестве основного «меню».

public class MainActivity extends AppCompatActivity {

    //Some Code
    private void startGame(View view) {
        Intent intent = new Intent(this, GameActivity.class);
        //Some extras
        startActivity(intent);

    }
}

Это вызывает следующую GameActivity:

public class GameActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
      super.onCreate(savedInstanceState)
      setContentView(R.layout.game_layout.xml); //only contains the fragment container

      new GameTast().execute();
    }

    //IOMethod is an interface the game calls when something should be displayed or input is requested
    class GameTask extends Asynctask<Void,Void,Void> implements IOMethod {

    @Override
    protected Void doInBackground(Void... voids){
    //Starting my game and waiting for finish
      Intent intent = new Intent(GameActivity.this, MainActivity.class);
      startActivity(intent);
      finish();
    }
    //Many methods for different views, e.g.
    public List<Character> promptForCharacterSelection(/*Backend params*/){
     getSupportFragmentManager().beginTransaction().replace(R.id.gameFrame, new IngameCharacterSelectionFragment()).commit();
    //wait for user to finish input
    }

  }

}

Игра отлично работает при первом ее запуске, но при втором запуске я получаю следующую трассировку стека:

2019-07-02 10:17:10.261 4392-4439/com.example.werewolves E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
    Process: com.example.werewolves, PID: 4392
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:354)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
        at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2080)
        at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2106)
        at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
        at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:637)
        at com.example.werewolves.GameActivity$GameTask.promptForPlayerSelection(GameActivity.java:167)
        at com.example.werewolvesgame.ClassicMethod.preStart(ClassicMethod.java:47)
        at com.example.werewolvesgame.PlayingMethod.start(PlayingMethod.java:20)
        at com.example.werewolvesgame.Game.start(Game.java:65)
        at com.example.werewolvesgame.Manager.newGame(Manager.java:42)
        at com.example.werewolves.GameActivity$GameTask.doInBackground(GameActivity.java:105)
        at com.example.werewolves.GameActivity$GameTask.doInBackground(GameActivity.java:97)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:764) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...