Android 更好的片段事务处理方法

Android 更好的片段事务处理方法,android,android-fragments,optimization,fragmenttransaction,Android,Android Fragments,Optimization,Fragmenttransaction,在优化和性能方面,哪种方法更适合分段事务 1. 父片段- FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.container, ChildFragment.newInstance(arrayList)); ft.commit(); FragmentManager fm = ge

在优化和性能方面,哪种方法更适合分段事务

1.

父片段-

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
    ft.commit();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.container, ChildFragment.newInstance(arrayList));
    ft.commit();
    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();
儿童碎片-

   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;
    }
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;
}
儿童碎片-

   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;
    }
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;
}

所有的方法都是错误的。 在第一种情况下,一个数组以可序列化的形式存储到bundle中,这会导致性能下降。您应该将其更改为可包裹阵列

bundlearrayList.putParcelableArrayList(AppConstant.ARRAYlIST, bPlanModels);
在这种情况下,列表对象必须实现
Parcelable
接口

当然,第一种方法可能是正确的,如果您将parcelable数组而不是serializable,还可以使用builder提高可读性:

getSupportFragmentManager().beginTransaction()
    .replace(R.id.container, ChildFragment.newInstance(arrayList))
    .commit();
第二个是完全错误的,因为默认构造函数应该留在片段中,否则系统将无法恢复其状态,并在尝试时抛出异常。另外,如果您要添加它,它也将是错误的,因为初始参数不会被恢复,因为它们不存在于输入包中

如果您试图在开始的片段中填充bundle,那么第三个是错误的封装,因为填充一个bundle是一个内部实现


顺便说一句,在实际项目中,我更喜欢将事务的责任从开始片段封装到特定的
TransactionManager
类。这种方法很容易用di框架来维护,比如dagger2,我已经更新了第三个框架。请查看它,并让我详细了解它与第一个框架相比不好的原因one@AndroidLearner所以在第三种情况下,我猜对了填充包的方式。无需更改)在第一种情况下,在事务完成之前,我们正在调用newInstance方法,在这里我们正在初始化bundle..那么在这种情况下,bundle也填充在start中?@AndroidLearner不完全是这样,start fragment的意思类似于启动事务的fragment类(您的“ParentFragment”,但它不完全是“ParentFragment”)如果我们在父片段类而不是从父类调用的子片段方法中填充bundle,那么在优化和性能方面有什么区别?