Recursive entry to executePendingTransactions 异常处理

最近在项目开发中,偶现遇到

java.lang.IllegalStateException: Recursive entry to executePendingTransactions

E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1589)
E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
E/AndroidRuntime: at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
E/AndroidRuntime: at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:476)E/AndroidRuntime: at

异常,真是头大,也没说是代码哪里出错了

以下是我实现功能代码:

if (fm == null) {
            fm = getSupportFragmentManager();
        }

        if (!views.isEmpty()) {
            FragmentTransaction ft = fm.beginTransaction();
            for (Fragment f : views) {
                ft.remove(f);
            }
            ft.commitAllowingStateLoss();
            ft = null;
            fm.executePendingTransactions();
        }

        views.clear();
        views.add(new GranaryMapFragment_());
        views.add(new BasisGranaryInfoFragment_());
        views.add(new GranarySMartFragment_());
        views.add(new GrainInfoFragment_());
        views.add(new GeneralGrainInfoFragment_());
        views.add(new GrainReportFragmentNew_());
        views.add(new GranaryMapFragment_());
        views.add(new BasisGranaryInfoFragment_());

        adapter.notifyDataSetChanged();

弄来弄起,想着不会是fragment源码bug吧,自己看代码与网上查资料,都没找到解决办法

最后思来想去就是不知道原因是什么o(╥﹏╥)o,之后用蠢办法,一个个将加载的fragment 注释掉运行检查,最后发现是其中一个fragment 中控件出现空指针(捂脸 )导致的,也是醉了。

原来使用viewpager 加载fragment ,fragment内部出现问题有时候报错了,log也不会打印说那出现问题,就直接会报java.lang.IllegalStateException: Recursive entry to executePendingTransactions异常,因此遇到这样的问题,以后就只能用蠢办法一个个debug fragment是否正常了

愿那些跟我一样遇到这样问题的朋友看到这个,给你提供一个思考方向早日解决问题

### 递归函数调用自身的常见问题及解决方案 当编写递归函数时,可能会遇到多种问题。这些问题通常涉及终止条件不充分、栈溢出以及性能瓶颈等方面。 #### 终止条件不足 如果递归函数缺乏有效的终止条件,则可能导致无限递归最终耗尽堆栈空间并引发错误。确保每次递归调用都朝着基础情况前进至关重要[^3]。 ```cpp // 错误示范:缺少终止条件 void faulty_recursive_function() { faulty_recursive_function(); // 这里没有提供任何退出机制 } ``` #### 栈溢出风险 由于每层递归都会占用一定的内存资源来保存局部变量和返回地址,在极端情况下这可能触发栈溢出异常。对于深度较大的递归场景尤其需要注意这一点[^2]。 ```cpp #include <iostream> using namespace std; int deep_recursion(int n) { if(n == 0){ return 1; }else{ cout << "Current depth:" << n << endl; return deep_recursion(n - 1); } } int main(){ int maxDepth = 987654; // 假设这个数值很大以至于超过了系统的默认最大递归层数限制 try{ deep_recursion(maxDepth); }catch(...){ // 捕获所有类型的异常 cerr << "Stack overflow occurred!" << endl; } return 0; } ``` #### 性能优化建议 针对复杂度较高的递归算法,可以考虑采用记忆化技术(Memoization),即通过缓存中间计算结果减少重复运算次数;或者转换成迭代形式以降低额外开销。此外,适当调整数据库配置参数如`@@cte_max_recursion_depth`也能帮助缓解因查询嵌套过深而产生的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值