2014, square在其技术博客上发表了Advocating Against Android Fragments,阐述了使用fragment可能会遇到的问题。
- lifecycle过于复杂
- hard to debug, FragmentManagerImpl的代码过于复杂。
- Fragment transactions 是异步的(post到UI队列的尾端),可能导致程序处于未知的状态
- 创建匿名内部Fragment时,如果activity要恢复这个fragment时,会因为找不到无参构造函数而报错。
比如
DialogFragment dialogFragment = new DialogFragment() {
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { ... }
};
dialogFragment.show(fragmentManager, tag);
会出现以下错误
android.support.v4.app.Fragment$InstantiationException:
Unable to instantiate fragment com.squareup.MyActivity$1:
make sure class name exists, is public, and has an empty
constructor that is public
所以Square提倡使用custom view来取代Fragment。
不过Fragments也有其自身的好处:
- 能够保存view的状态,如果用custom view,需要开发者自己保存状态,增加了复杂度
- 对backstack的支持,custom view如果要支持backstack,需要使用第三方库,比如Flow,SimpleStack。
一种使用Fragment的pattern是One-Activity-Multiple-Fragments architecture。
现在Fragment的bug大多已经fix了,通过使用MVP,将business logic移到Presenter中,可以减少Fragment的错误。所以还是大胆用Fragment吧
Fragment 仍然存在的bug(已用最新的support-v7:26.1.0测试来源):
-
Nested Fragment在父Fragment的离开动画时会消失
-
Nested Fragment setRetainInstance is inherited(已经修复)
-
Nested Fragment onActivityResult is broken(已经修复)
网友评论