将活动或片段传递给静态方法是不好的

时间:2018-05-29 08:45:35

标签: android

如果我有如下方法:

public static void doSomething(Activity aActivity){
    //do Something With The Activity
}

在内存使用方面,将活动/片段传递给静态方法是个坏主意吗?可以使用此方法在应用程序的生命周期内保留对活动的任何方法的引用吗?

如果我有这样的话:

public static void doSomething(View aView){
    //do Something With The View
}

这会在应用程序的生命周期内保持对视图的引用吗?

这2个例子如果使用得足够,会导致内存泄漏或OOM问题吗?

3 个答案:

答案 0 :(得分:2)

ActivityContext作为参数传递给static方法没有任何问题。只要您未在[{1}}变量中存储对ActivityContext的引用,就不存在内存泄漏!

即使你在static变量中存储了一个引用,这也是一个很小的内存泄漏,因为下一次调用该方法会覆盖引用,从而释放以前存储的对象以进行潜在的垃圾回收。因此,没有机会逐渐消耗所有可用内存。

答案 1 :(得分:1)

调用静态方法并向其传递参数不会创建内存泄漏。

一般来说,将Activity / Context / View存储到静态变量中是不好的做法(正如D. Wasser和其他所有人都告诉你的那样),但是:

  • 您甚至可以从成员方法
  • 存储静态变量 无论如何,
  • Android Studio会发出警告。

避免这样,你会没事的。

另外,来自Android docs

  

如果您不需要访问对象的字段,使您的方法保持静态。调用速度将提高约15%-20%。它也是良好做法,因为你可以从方法签名中看出调用方法不能改变对象的状态。

如果你有一个static方法用于自定义(假设)你View,我会考虑对给定的View进行子类化并将其行为指定为私人会员职能。

答案 2 :(得分:-1)

将某些内容传递给静态函数并不是潜在的内存泄漏。将变量存储在静态变量中是。这种技术非常安全。我甚至推荐它,因为你可以将变量传递给函数并将它们存储在将要使用这些额外内容的类中的额外内容中,减少需要知道它们存在的位置的数量以及它们的存在方式#39;重新布局。

Passing a activity context into a static method, memory leak potential?