问题环境:
考虑性能问题,第一次启动的时候不加载全部四个Fragment,当点击对应的按钮时判断是否添加过Fragment(如果没有则创建Fragment,manager.add()),同时根据点击的按钮来处理哪个Fragment的显示。BUG:
初次启动时,只有第一个Fragment,然后快速点击多个其他按钮,程序崩溃。
FATAL EXCEPTION: main
Process: com.mysteel.banksteeltwo, PID: 30552
java.lang.IllegalStateException: Fragment already added: MainSuperMarketFragment{30204b26 #3 id=0x7f0c0137}
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1319)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:671)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:139)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:927)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:722)
用isAdded检查是否添加了,最后发现是show方法本身的问题,因为一些异步操作的问题,使的show方法判断是否添加不精确,故而抛出异常。
粗糙的解决方法:
- 不管,不快速点击的话不会出现问题
- 第一次启动直接把四个Fragment都创建添加