【问题标题】:Is it a good practice to start activity using static method from another activity?使用另一个活动的静态方法开始活动是一种好习惯吗?
【发布时间】:2020-05-03 01:49:19
【问题描述】:

我认为这是使用像这样的静态方法启动活动的一种常见做法

class HomeScreenActivity{
  ....
  ....

  public static void startHomeActivity(Context context){
    Intent intent = new Intent(context,HomeScreenActivity.class);
    activity.startActivity();
  }
  ....
  ....

}


class LoginActivity{
  ....
  ....

  public void startActivity(){
    HomeScreenActivity.start(this);
  }    
  ....
  ....
}

这是一个好习惯吗,它会造成内存泄漏,会造成什么问题?

【问题讨论】:

  • 我什至认为这是一个很好的做法。

标签: java android android-activity memory-leaks heap-memory


【解决方案1】:

如果这是您要问的问题,这不是一个坏习惯。

一种不好的做法是,例如,在静态字段中有一个上下文变量,这会造成泄漏。例如:

public class App extends Application {
    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this

    }
}

这是一种不好的做法。 android studio 应该警告你(静态上下文字段)。例如,这可以通过使用WeakReference 来解决。

但是由于您示例的方法是静态的,并且上下文是作为参数提供的,所以它没有任何问题。如果您希望方法是静态的,最好将活动/上下文对象作为参数传递。

如果您怀疑存在泄漏,您可以覆盖该上下文的 onDestroy 方法以查明何时存在泄漏(不会调用 onDestroy,因为仍然存在对它的引用)。此外,可以通过使用 Memory Profiler 和/或 LeakCanary 库来发现泄漏。

【讨论】:

  • 如果我们正在传递活动上下文,并且该活动被破坏,即登录活动被破坏,在这种情况下它会造成泄漏,对吗?
  • 仅在我发布的不良做法示例中,而不是在您的代码中,因为在您发布的代码中,它会立即使用并且不会保存在任何地方。泄漏意味着它应该被销毁,但它不能被销毁,因为仍然有对它的引用。
  • 我刚刚添加了一些关于如何查找答案是否存在泄漏的信息,因为这也与问题相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
相关资源
最近更新 更多