我开始学习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));
}
非常感谢你。
答案 0 :(得分:3)
查看Android开发者博客上的Avoiding memory leaks文章。保持静态字段持有Context或任何其他具有(强)引用Context的类(例如任何View)将意味着垃圾收集器将无法回收分配的存储由上下文。如果上下文是一个应用程序,那就没关系,因为它们的存在时间和应用程序一样长,并且无论如何都不会被垃圾收集。但是在视图的情况下,Context可能是一个应尽快进行垃圾收集的活动。
这并不意味着所有静态字段都会灾难性地泄漏内存。如果它们是原始类型,简单类,甚至是对其他类具有弱引用的更复杂的类,它们可能无法阻止垃圾收集器回收大量内存。但通常有静态,特别是公共静态字段是代码气味,应该避免使用,以便以后更容易维护代码。