片段事务的更好方法

时间:2016-10-31 15:53:23

标签: android android-fragments optimization fragmenttransaction

在优化和性能方面,哪种更好的片段事务处理方法?

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();

1 个答案:

答案 0 :(得分:2)

所有方法都不正确。 在第一个数组中存储为可序列化的包,这导致性能不足。您应该将其更改为parcelable array。

bundlearrayList.putParcelableArrayList(AppConstant.ARRAYlIST, bPlanModels);

在这种情况下,列表对象必须实现Parcelable接口。

当然第一个可能是正确的,如果你把parcelable数组而不是serializable,也可以使用builder来提高可读性:

getSupportFragmentManager().beginTransaction()
    .replace(R.id.container, ChildFragment.newInstance(arrayList))
    .commit();

第二个是完全错误的,因为默认构造函数应该留在Fragment中,否则系统将无法恢复其状态并在尝试时抛出异常。此外,如果你要添加它,它也将是错误的,因为初始参数将不会被恢复,因为它们不存在于输入包中。

如果你试图在开始片段中填充bundle,第三个是封装不好的,因为填充一个bungle是一个内在的实现。

顺便说一句,在实际项目中,我更喜欢将事务的责任从开始片段封装到特定的TransactionManager类。使用di框架(如dagger2

)可以轻松维护该方法