getActivity()开销

问题描述 投票:2回答:2

纯粹从软件工程的角度来看,getActivity()有多少开销?

我在整个应用程序中多次使用此方法,并考虑使用参考getActivity()的全局变量。

通过使Activity的全局变量涉及到其他并发症会是什么?

我的应用程序只有一个activity但很多片段。

android performance software-design
2个回答
2
投票

如果将Actvivity存储在全局变量中,则可能存在内存泄漏的风险(特别是如果将其存储在外部类/ Fragment中),因为我认为您将在strong引用中以传统方式保存它。例如:

public MyActivity myActivity = getActivity();

虽然目前尚未就此达成最终全球协议,但最有可能的结果是,当Android试图gc Activity时,它将被阻止,因为仍然有strong指向它。

一个可能的解决方案是将你的Activity包裹在java.lang.ref.SoftReference<T>java.lang.ref.WeakReference<T>中。

E.g:

private Reference<MyActivity> activityReference = new WeakReference<>(myActivity);

当你检索它(在外部类/ Fragments)检查是否还没有gc

if (activityReference.get() != null) {
    // still alive...
}

是的,人们这样做。


正如@Sarthak Mittal所说,只要您没有注意到应用程序中的特定开销,就不要尝试进行优化。

另外,检查getActivity()的代码,因为它可能只是一个getter,在这种情况下,它不应该带来任何重大的计算费用。


2
投票

你真的担心过早优化。

在现代系统中,调用简单返回实例变量的方法所花费的时间是以纳秒为单位(可能不是在Android设备的情况下,但仍然不需要担心)

© www.soinside.com 2019 - 2024. All rights reserved.