Fragment already added异常的原因与解决办法

1、异常的表现形式

前几天遇到一个跑monkey发现的崩溃:

java.lang.IllegalStateException: Fragment already added: XXDialogFragment

排查了一下,发现是有一个【点击按钮弹出弹窗提示】的操作导致的。
快速多次点击按钮,100%复现崩溃。

2、异常的发生原因

看了下DialogFragment的show方法的源码,发现每次show的时候都会提交一个add fragment的事务,如图:
Fragment already added异常的原因与解决办法_第1张图片

所以当快速多次点击按钮时,调用了多次的show方法,添加了多个add事务(add事务A、add事务B等等)。
然后系统在执行事务队列时,在执行了add Fragment后,发现又要add这个fragment,就报异常了,源码如图:
Fragment already added异常的原因与解决办法_第2张图片

【总结一下】
就是快速多次点击按钮时,添加了多个连续的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();
        }
    }


4、demo地址

点击查看,本文章的相关demo类

你可能感兴趣的:(android,android,异常)