Fragmnet为何一定需要空的构造方法

写项目的时候如果需要对碎片的构造方法传入参数(即创建一个有参的构造方法),此时会飘红

Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead...

大概意思就是避免创建有参的构造方法,推荐使用无参的构造方法,那么这是为什么呢?
在网上查了下,发现是在程序因为系统内存不足而被kill的时候(不是真意义上的结束程序),当重新回到这个页面的时候,系统就会利用反射来重新构建一个新的fragment:

public static Fragment instantiate(Context context, String fname, Bundle args)

而此时会有以下两种情况:

InstantiationException,如果类没有empty constructor,该异常就会抛出。
IllegalAccessException,如果类没有publicempty constructor,该异常就会抛出。

当然以上思路都是来自网上的思路,不过我的想法是,退一万步讲就算不抛出这两个异常,利用反射的时候参数中可以看出传入了Bundle,而并没有参数保存了你创建构造方法传的参数,所以系统会推荐你使用Bundle来传递参数。

附上参考地址

补充

那么现在有个问题,就是既然Fragmnet容易被kill,那么我使用activity总的Intent存这些数据总可以了吧,如下

   recruitId = getActivity().getIntent().getIntExtra(AppConstant.INTENT_RECRUIT_ID, 0);

这显然是可以的,但是不要忘记,Fragment的本意就是创建时,建议有自己独立的逻辑,视图,这样才能在使用场景改变时,更方便直接引用(比如我现在要把Fragmnet放到Dialog中),如上的话便与Activity有了耦合性,违背初衷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值