使用公共静态字段/变量是不是很糟糕?

时间:2015-01-22 12:32:24

标签: android memory-leaks static android-memory

我开始学习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));
}

非常感谢你。

1 个答案:

答案 0 :(得分:3)

查看Android开发者博客上的Avoiding memory leaks文章。保持静态字段持有Context或任何其他具有(强)引用Context的类(例如任何View)将意味着垃圾收集器将无法回收分配的存储由上下文。如果上下文是一个应用程序,那就没关系,因为它们的存在时间和应用程序一样长,并且无论如何都不会被垃圾收集。但是在视图的情况下,Context可能是一个应尽快进行垃圾收集的活动。

这并不意味着所有静态字段都会灾难性地泄漏内存。如果它们是原始类型,简单类,甚至是对其他类具有弱引用的更复杂的类,它们可能无法阻止垃圾收集器回收大量内存。但通常有静态,特别是公共静态字段是代码气味,应该避免使用,以便以后更容易维护代码。

相关问题