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

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();
        }
    }


4、demo地址

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值