1、异常的表现形式
前几天遇到一个跑monkey发现的崩溃:
java.lang.IllegalStateException: Fragment already added: XXDialogFragment
排查了一下,发现是有一个【点击按钮弹出弹窗提示】的操作导致的。
快速多次点击按钮,100%复现崩溃。
2、异常的发生原因
看了下DialogFragment的show方法的源码,发现每次show的时候都会提交一个add fragment的事务,如图:
所以当快速多次点击按钮时,调用了多次的show方法,添加了多个add事务(add事务A、add事务B等等)。
然后系统在执行事务队列时,在执行了add Fragment后,发现又要add这个fragment,就报异常了,源码如图:
【总结一下】
就是快速多次点击按钮时,添加了多个连续的add事务,
而系统在执行add fragment时如果已经add过了当前fragment,则不允许再add,add就报异常。
3、解决办法
既然知道异常的原因是【执行了多次show方法,添加了多个连续的add事务】
那我们就改写下show方法,让add事务不连续,每次add之前都把原来的remove掉。
解决代码如下:
public class TestDialogFragment extends DialogFragment {
其他代码......
@Override
public void show(FragmentManager manager, String tag) {
try {
//在每个add事务前增加一个remove事务,防止连续的add
manager.beginTransaction().remove(this).commit();
super.show(manager, tag);
} catch (Exception e) {
//同一实例使用不同的tag会异常,这里捕获一下
e.printStackTrace();
}
}