这2个选项中哪一个更适合性能?

时间:2013-12-17 23:36:07

标签: android performance memory field cpu

我在Android应用中使用片段。在这些片段中,我需要一个Context对象来重复使用它(大约10次)和一些方法调用。

如您所知,我有两个选择:

选项I:

public class MyFragment extends Fragment{
    public void onCreate(Bundle savedInstanceState){
        super(savedInstanceState);

        //call a lot of methods and use getActivity() a lot of times
    }
}

方案二:

public class MyFragment extends Fragment{

    private Activity mActivity;

    public void onCreate(Bundle savedInstanceState){
        super(savedInstanceState);

        mActivity = getActivity();
        //call a lot of methods and use mActivity
    }
}

我知道声明mActivity字段需要一些内存(多少?),但我认为调用getActivity需要一些CPU处理。

这两个选项中哪一个更好,为什么?


编辑:

好吧,看看Android源代码,我可以在Fragment类中找到getActivity()方法的来源:

final public FragmentActivity getActivity() {
    return mActivity;
}

所以,正如你所看到的,在选项II中,mActivity被保留两次,这是浪费内存所以从现在开始我将使用选项I.

感谢您的回答,他们让我理解了这一点:)

3 个答案:

答案 0 :(得分:4)

  

但我认为调用getActivity需要一些CPU处理。

它比你想象的要少。 getActivity只是访问一个字段,获取Activity。它没有太多的CPU涉及。你的第二种方法需要一点内存,首先需要一点堆栈see this来提高性能。

另一方面。如果您在当前代码中没有任何内存问题,则为premature optimization.

答案 1 :(得分:3)

好吧,看看Android源代码,我可以在Fragment类中找到getActivity()方法的来源:

final public FragmentActivity getActivity() {
    return mActivity;
}

所以,正如你所看到的,在选项II中,mActivity被保留两次,这是浪费内存所以从现在开始我将使用选项I.

感谢您的回答,他们让我明白了这个:)

答案 2 :(得分:2)

第二种选择更好。您只能使用一次getActivity()。在第一个选项中,您将多次调用它,这很昂贵。声明动态性会耗费一些内存。由于mActivity不是真正的对象,而是对象的引用,因此它不会占用太多内存。