使用 public static fields/variables 不好吗?

is it bad to use public static fields/variables?

我开始学习 Android 开发,我读到静态变量不好,可能会泄漏内存,因为它们不是垃圾回收的。

我在某些情况下使用过一些,但我很担心它可能会泄漏内存。

有人可以看看我下面的代码,看看它们是否泄漏内存吗?

MainActivity.java

public class MainActivity extends Activity {

public static boolean IS_ACTIVITY_OPEN;
public static ImageView image;

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);        
        IS_ACTIVITY_OPEN = true;

    ....

    ....

    VoiceReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(final Context context, Intent intent) {
       .....
    };
    registerReceiver(VoiceReceiver, new IntentFilter(BroadCastReceivers.VoiceIntent));

@Override
public void onDestroy() {
    super.onDestroy();  
    unregisterReceiver(VoiceReceiver);          
    IS_ACTIVITY_OPEN = false;
    }   
}

Picture.java

MainActivity.image.setImageBitmap(resizedBitmap);

.....

.....

BroadCast.java

if (!MainAcitivty.IS_ACTIVITY_OPEN) {
    //start an activity
    Intent intent2 = new Intent(context, MainAcitivty.class);            
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent2); 
    handler=  new Handler();
    MyPostDelay = new Runnable() {

        @Override
        public void run() { 
            context.sendBroadcast(new Intent(VoiceIntent));
        }
    };
    handler.postDelayed(MyPostDelay, 300);
}
else
{
    context.sendBroadcast(new Intent(VoiceleIntent));
}

非常感谢您。

查看 Android 开发者博客上的 Avoiding memory leaks 文章。保留一个包含上下文的 static 字段,或任何其他具有对上下文(例如任何视图)的(强)引用的 class 将意味着垃圾收集器不会能够回收上下文分配的存储。如果上下文是一个应用程序,那没关系,因为它们的寿命与您的应用程序一样长,并且无论如何都不会被垃圾收集。但在视图的情况下,上下文可能是一个 Activity,应该尽快进行垃圾收集。

这并不意味着所有 static 字段都会灾难性地泄漏内存。如果它们是原始类型,或者简单的 classes,或者更复杂的 classes 对其他 classes 的弱引用,它们可能不会阻止垃圾收集器回收大量记忆。但是通常有 static 尤其是 public static 字段是一种代码味道,应该避免,这样代码以后更容易维护.