java - 使用 Fragments 时如何防止“IllegalStateException”
问题描述
我目前正在为派对游戏“Millers Hollow 的狼人”编写游戏应用程序。当游戏中的任何角色需要做出决定时,就会创建一个包含所有必要信息的新片段。这一切都很好,直到我第二次开始我的游戏,然后,在第一次提交时,IllegalStateException
抛出了 a。
我已经尝试过使用commitAllowingStateLoss()
,但这只会导致不可见的 UI。从片段管理器中删除所有片段也无济于事。
我的应用程序以主要活动作为主要“菜单”开始。
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)
解决方案
推荐阅读
- javascript - 在非输入元素上使用 v-model 并将其绑定到 innerHTML 值
- mysql - Docker服务互通故障排除
- arrays - 在 MongoDB 中操作深层嵌套数组
- javascript - 对 Parent 中的状态变化做出反应,是否将其所有子项和子项的渲染调用作为迭代?
- python - 无法在views.py中导入models.py
- java - 访问涉及嵌套私有方法的覆盖函数的公共变量
- react-native - 安装应用程序时如何在设备上存储数据
- java - 如何在抽象父类上正确实现 CardLayout
- windows - 通过 Ansible 从 Powershell 执行 .bat 文件
- html - 尝试对齐社交媒体图标,使它们在分隔符之间完美居中