碎片交易的更好方法
Better approach for fragment transaction
就优化和性能而言,片段事务的哪种方法更好?
1.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
ft.commit();
ChildFragment-
public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels) {
ChildFragment fragment = new ChildFragment();
Bundle bundlearrayList = new Bundle();
bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels);
fragment.setArguments(bundlearrayList);
return fragment;
}
2.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
ft.commit();
ChildFragment-
private ArrayList<BrowsePlanModel> bPlanModels;
public ChildFragment(ArrayList<PlanModel> bPlanModels)
{
this.bPlanModels=bPlanModels
}
public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels)
{
ChildFragment fragment = new ChildFragment(bPlanModels);
return fragment;
}
3.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();.
ChildFragment fragment = new ChildFragment();
Bundle bundlearrayList = new Bundle();
bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels);
fragment.setArguments(bundlearrayList);
ft.replace(R.id.container, fragment);
ft.commit();
所有的方法都是不正确的。
在第一个数组中存储为可序列化的捆绑包,这导致性能不足。您应该将其更改为可打包数组。
bundlearrayList.putParcelableArrayList(AppConstant.ARRAYlIST, bPlanModels);
在这种情况下,您的列表对象必须实现 Parcelable
接口。
当然第一个可能是对的,如果你把 parcelable array 而不是 serializable,也使用 builder 来提高可读性:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, ChildFragment.newInstance(arrayList))
.commit();
第二个完全错误,因为默认构造函数应该留在片段中,否则系统将无法恢复其状态并在尝试时抛出异常。此外,如果您要添加它,它也将是错误的,因为初始参数不会被恢复,因为它们不存在于输入包中。
如果你试图在开始的片段中填充 bundle,第三个封装不好,因为填充 bungle 是一种内部实现。
顺便说一下,在实际项目中,我更喜欢将事务的责任从开始片段封装到特定 TransactionManager
class。这种方法很容易用 di 框架维护,比如 dagger2
就优化和性能而言,片段事务的哪种方法更好?
1.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
ft.commit();
ChildFragment-
public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels) {
ChildFragment fragment = new ChildFragment();
Bundle bundlearrayList = new Bundle();
bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels);
fragment.setArguments(bundlearrayList);
return fragment;
}
2.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
ft.commit();
ChildFragment-
private ArrayList<BrowsePlanModel> bPlanModels;
public ChildFragment(ArrayList<PlanModel> bPlanModels)
{
this.bPlanModels=bPlanModels
}
public static ChildFragment newInstance(ArrayList<PlanModel> bPlanModels)
{
ChildFragment fragment = new ChildFragment(bPlanModels);
return fragment;
}
3.
ParentFragment-
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();.
ChildFragment fragment = new ChildFragment();
Bundle bundlearrayList = new Bundle();
bundlearrayList.putSerializable(AppConstant.ARRAYlIST, bPlanModels);
fragment.setArguments(bundlearrayList);
ft.replace(R.id.container, fragment);
ft.commit();
所有的方法都是不正确的。 在第一个数组中存储为可序列化的捆绑包,这导致性能不足。您应该将其更改为可打包数组。
bundlearrayList.putParcelableArrayList(AppConstant.ARRAYlIST, bPlanModels);
在这种情况下,您的列表对象必须实现 Parcelable
接口。
当然第一个可能是对的,如果你把 parcelable array 而不是 serializable,也使用 builder 来提高可读性:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, ChildFragment.newInstance(arrayList))
.commit();
第二个完全错误,因为默认构造函数应该留在片段中,否则系统将无法恢复其状态并在尝试时抛出异常。此外,如果您要添加它,它也将是错误的,因为初始参数不会被恢复,因为它们不存在于输入包中。
如果你试图在开始的片段中填充 bundle,第三个封装不好,因为填充 bungle 是一种内部实现。
顺便说一下,在实际项目中,我更喜欢将事务的责任从开始片段封装到特定 TransactionManager
class。这种方法很容易用 di 框架维护,比如 dagger2