【问题标题】:Is it adding fragments to ArrayList is bad for performance?向 ArrayList 添加片段是否对性能不利?
【发布时间】:2017-02-28 09:59:23
【问题描述】:

这里我以静态方法将一些Fragments 添加到List

public static List<Fragment> TOOLS(){
        List<Fragment> fragments=new ArrayList<>();
        fragments.add(new SubjectFragment());
        fragments.add(new ExamFragment());
        fragments.add(new AdminToolsFragment());
        return fragments;
    }

我使用它是因为我的方便。 早期我使用 switch 语句

switch (textView.getId()) {
            case R.id.subject:
                onButtonPressed(new SubjectFragment(), "Subject");
                break;
            case R.id.exam:
                onButtonPressed(new ExamFragment(), "exam");
                break;
            case R.id.tools:
                onButtonPressed(new AdminToolsFragment(), "adminTools");
                break;
}

现在我用List 代替了switch 语句。 像这样。

fragments.get(position);

我的问题是在创建片段对象时出现的

new MyFragment();

即。创建越来越多的实例是昂贵的。所以在 switch 语句中,一次只创建 一个实例。但是当使用列表时

    fragments.add(new SubjectFragment());
    fragments.add(new ExamFragment());
    fragments.add(new AdminToolsFragment());

一次创建多个实例

问题是。 将片段添加到列表是否对性能不利?如果不是,那是什么原因?

【问题讨论】:

    标签: android android-fragments arraylist


    【解决方案1】:

    我认为不,因为如果您有很多不同的片段,您应该使用 ArrayList 来快速访问每个项目。在你有几个片段之前,它们之间没有区别。

    附言如果我在使用具有相同结构的片段时理解正确,请使用 newInstance 方法,如果没有 - 只有创建一个新对象。

    【讨论】:

    • 使用 switch 时只创建一个对象。
    【解决方案2】:

    一般来说,建议我们尽可能减少创建未使用的对象。在像手机这样的内存限制平台中也是如此,强烈建议遵循这一点。

    在这里,您将创建两个未使用的 Fragment 对象和一个可以避免的 List 对象。使用 switch 不会对性能产生任何重大影响,因为它只有少数情况。所以在你的情况下,建议使用 switch。

    【讨论】:

      【解决方案3】:

      我认为你应该使用 FragmentManager,当你显示一个片段时,你可以为它添加一个标签

      Fragment newFragment = new FunnyFragment();
      FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
              transaction.replace(R.id.requestContainer, newFragment, "YOU_TAG_NAME");
              transaction.addToBackStack(FunnyFragment.class.getSimpleName());
              transaction.commit();
      

      当您需要再次获取该片段时,只需调用:

      FunnyFragment funnyFragment = (FunnyFragment)getFragmentManager()
                              .findFragmentByTag("YOU_TAG_NAME");
      

      【讨论】:

      • 我已经在使用它了。我只是将片段传递给FragmentTransactionreplace() 方法
      • 你可以在 findFragmentByTag 时检查 if(funnyFragment!=null) 。如果为null,则创建一个新的,如果不为null,则使用它。
      • 谢谢。但说真的,我知道..:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2012-03-12
      • 2017-02-26
      • 2016-06-28
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多