Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么说静态活动在Android中是一种糟糕的做法_Java_Android_Memory Leaks_Garbage Collection - Fatal编程技术网

Java 为什么说静态活动在Android中是一种糟糕的做法

Java 为什么说静态活动在Android中是一种糟糕的做法,java,android,memory-leaks,garbage-collection,Java,Android,Memory Leaks,Garbage Collection,为什么会出现内存泄漏?为什么我们说这篇文章写得很糟糕? 我想从GC原理来理解它。onDestroy并不总是被调用,如果不是,你就会泄漏。始终调用onStop,如果您在此处将mainActivity设置为null,则可能没有泄漏。但我想知道你为什么会需要这个 此外,你的: public static MainActivity mainActivity ; public static MainActivity instance() { return mainActivity ; } @

为什么会出现内存泄漏?为什么我们说这篇文章写得很糟糕?
我想从GC原理来理解它。

onDestroy并不总是被调用,如果不是,你就会泄漏。始终调用onStop,如果您在此处将mainActivity设置为null,则可能没有泄漏。但我想知道你为什么会需要这个

此外,你的:

public static MainActivity mainActivity ;

public static MainActivity instance() {
    return mainActivity  ;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_navigation);
    mainActivity  = this;

}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mainActivity  != null) {
        mainActivity  = null;       
    }      
}

是静态的,使用“this”,我认为这是不可能的。静态方法中没有“this”。

谢谢。“this”是我的错误,我更正了它。事实上,我不需要它,我只知道为什么我们说这种书写方式如此糟糕,我想从GC原理来理解它。因为你不能完全“相信”onDestroy被调用。将它放在上面可能很好,但非常奇怪。从标记为duplicate的问题的答案中可能会出现重复:“该类分配一大块内存(例如新字节[1000000]),在静态字段中存储对它的强引用,然后在ThreadLocal中存储对自身的引用。”。由于Activity分配了一大块内存(用于其视图),并且您正在将一个强引用放在一个静态字段中,所以您现在需要做的就是创建一个具有更长生命周期引用该静态字段的类。那么你就造成了内存泄漏
public static MainActivity instance() {
    if(mainActivity == null){
         mainActivity  = this;
    }
    return mainActivity  ;
}