使用 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 字段是一种代码味道,应该避免,这样代码以后更容易维护.
我开始学习 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 字段是一种代码味道,应该避免,这样代码以后更容易维护.