Android 使用公共静态字段/变量是否不好?

Android 使用公共静态字段/变量是否不好?,android,memory-leaks,static,android-memory,Android,Memory Leaks,Static,Android Memory,我开始学习安卓系统的开发,我读到关于静态变量不好,可能会泄漏内存,因为它们不可垃圾回收 我在某些情况下使用过一些,但我非常担心它可能会泄漏内存 有人能看看我下面的代码,看看他们是否泄漏内存吗 MainActivity.java public class MainActivity extends Activity { public static boolean IS_ACTIVITY_OPEN; public static ImageView image; @Override publ

我开始学习安卓系统的开发,我读到关于静态变量不好,可能会泄漏内存,因为它们不可垃圾回收

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

有人能看看我下面的代码,看看他们是否泄漏内存吗

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开发者博客上的文章。保持一个包含上下文的静态字段,或任何其他对上下文(如任何视图)具有(强)引用的类,将意味着垃圾收集器将无法回收上下文分配的存储。如果上下文是一个应用程序,那没关系,因为它们的寿命和你的应用程序一样长,而且不会被垃圾收集。但在视图的情况下,上下文很可能是一个应该尽快进行垃圾收集的活动


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

,缓存视图是一个坏主意,因为它们是为重新创建而设计的,您可以用一个简单的getter替换公共布尔值,该getter根据对象的状态返回true或false。通常,可以使用static和final组合来创建永远不会更改的值。如果你不能用“是”来回答“这应该从任何地方都可以访问吗?”的问题,不要公开静态变量和方法。如果你害怕,请持久保存数据。。将静态变量放入活动中可能会导致接收者以某种方式行事。。单身,或廉价的共享参考。。拿着imageview不是很好,而是从imageview创建一个位图。。你可以用谷歌搜索它。类似于
imageView.buildDrawingCache()
。非常感谢你的评论。如果我使用SharedReferences来保存IS_ACTIVITY_OPEN boolean,然后在广播中检索它,它应该很好,对吗?从SharedReferences检索IS_ACTIVITY_OPEN布尔值时,新的布尔值将是可垃圾回收的,对吗?谢谢你的评论谢谢你能帮我也做这个吗?在整个活动中,我一直使用一个字符串或int。例如,我在一开始就初始化私有字符串imagePath,并在不同的方法中使用它。例如,imagePath=“…”,然后在另一个方法中,我调用File File=new File(imagePath)。我担心这个想法可能会漏掉记忆。基本上,这个imagePath是浮动的,并且一次又一次地被重用,这是不是很糟糕?