Android FragmentAndroid知识

为什么使用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》第二版中第一条所说:考虑用静态方法代替构造器有诸多好处。

  1. 它们有名称
  2. 不必在每次调用时创建一个新对象
  3. 可以返回原类型的任何子类型的对象
  4. 在创建参数化类型实例的时候,它们使得代码变得更加简洁

更多具体内容请参考《Effective java》

注:没有任何方法阻止内存不足时被系统回收

上一篇下一篇

猜你喜欢

热点阅读