0

所以我有一个Global类应该包含可以从我的所有文件中访问的各种数据。Global看起来像这样:

public class Global{
public static int rules = 0;
public static String data;
public static int score;
public static int speed = 0;
//etc...
}

我通过做之类的事情来设置和完成它Global.x = ___

然而,我最近在我的项目中清理了一个内存泄漏View A,我创建的视图 ( ) 的寿命比预期的要长。

View A分配Global.x.

现在,一旦我移动到View BView A就会被 GC 处理。

但是,Global.x不再具有价值。

这是 Java 的预期行为吗?如果是这样,我如何将一个变量分配给我的 Global 类,View A并确保它即使在View A死后也能保留。

还是我只是在其他地方做错了什么?

我想我会问以防万一我忽略了某些东西,但可能是后者。

4

2 回答 2

3

您所说的问题缺少可以帮助您解决特定问题的事实。考虑粘贴您可以创建的重现问题的最小 Java 代码。话虽如此,您的设计很糟糕,您应该考虑使用单例。

public class Global { 

    private Global INSTANCE = new Global();
    private int speed;

    private Global() { 
        // whatever you do to initialize...
        speed = 65;
    }

    public Global getInstance() { 
    }

    public int getSpeed() { 
        return speed;
    }

    public void setSpeed(int speed) { 
        this.speed = speed;
    }
}

无论你在什么范围内,你都可以说:

Global.getInstance().getSpeed();

或者

Global.getInstance().setSpeed(25);

ETC...

于 2013-02-19T04:59:29.220 回答
2

撇开设计问题不谈;

我能想到的实际上只有两种方法可以使垃圾收集View A对 的值产生影响Global.x

  • Global.x是(或使用)一个WeakReferenceView A或与之一起被垃圾收集的东西。
  • View A有一个终结器来改变Global.x.

这些听起来都不太可能(尽管我当然看不到您的代码)

我最好的选择是你应该在别处寻找错误。由于全局状态变量本质上不是线程安全的,因此您的问题很可能与线程相关。

于 2013-02-19T05:01:14.073 回答