为什么使用Fragment Arguments,而非构造函数
2016-02-19 本文已影响753人
CPPAlien
下面先分别对构造行数方法(方法一)和argument静态工厂方法(方法二)举个样例代码。
方法一:
String content;
public SecondFragment(String content) {
this.content = content;
}
方法二:
public static SecondFragment newInstance(String content) {
Bundle args = new Bundle();
args.putString("content", content);
SecondFragment fragment = new SecondFragment();
fragment.setArguments(args);
return fragment;
}
往往我们在做Activity向Fragment传递参数时会用方法二,而不会用方法一。这里有以下几个原因,最主要的原因是当系统重建fragment时,所有在类中声明的变量都会丢失。所以如果你使用方法一,当遇到用户改变系统配置或你的app后台后被系统回收而导致fragment重建,则content内容丢失。而在使用argument方法时,则内容不会丢失,在fragment重建后,通过getArguments可以找回。
当然也有童鞋说我可以使用onSaveInstanceState的方法来在fragment被重建前先保存内容,然后在onCreate(Bundle)时重新赋值。这个方法也是可行的。但这种方法既不容易控制而且也增加了复杂性,比如以后你想多增加一个参数,还需要记得在onSaveInstanceState方法中添加一条。
咱们之所以使用第二种方法,还有另外一些原因,一方面它维持了fragment的封装性,因为静态方法不包含指向外围类的引用。另一方面根据《Effective Java》第二版中第一条所说:考虑用静态方法代替构造器有诸多好处。
- 它们有名称
- 不必在每次调用时创建一个新对象
- 可以返回原类型的任何子类型的对象
- 在创建参数化类型实例的时候,它们使得代码变得更加简洁
更多具体内容请参考《Effective java》
注:没有任何方法阻止内存不足时被系统回收