静态变量,libgdx和android暂停/恢复内存使用

时间:2017-06-04 06:00:28

标签: java android libgdx

程序示例:

public class main extends ApplicationAdapter
{
    public static int a;
    public static int b;
    public static Player player;

    public void create()
    {
        resume();
    }

    public void render()
    {
    }

    public void resize()
    {
    }

    //pause runs when home button is pressed
    public void pause()
    {
        player = null;
    }

    //resume runs when the program is re-opened
    public void resume()
    {
        a = 10;
        b = 20;
        player = new Player();
    }
}

在android上,当按下主页按钮时,程序保存在内存中,静态变量保持其值。现在重新打开这个程序时,这个例子是创建新的静态变量还是只为内存中的旧静态变量赋值?

我问,因为我有一个程序有一个问题,按回家并重新打开程序导致内存每次增加,我想知道这是否可以发挥作用为什么这样做发生。

更新:播放器对象在再次创建之前被声明为null时是否会从内存中删除?

2 个答案:

答案 0 :(得分:2)

静态引用的生命周期与应用程序的生命周期不同。换句话说,应用程序的多个实例可能使用相同的静态变量。

如果在应用程序的方法中将静态变量设置为null,那么对于在同一VM中运行的应用程序的所有实例,您将其设置为null。设置对null的引用并不意味着内存实际上是免费的。只有当没有对同一对象的其他引用并且运行垃圾收集器时,才会删除该对象。

尽管如此,请注意pauseresume方法不是正确的方法。实际上,出于上述原因,除非您正确管理这些static引用,否则不应将static关键字用于特定于应用程序的一个实例的内容。例如,libgdx通过保留应用程序实例的映射及其使用的资源来在幕后执行此操作。这使您可以拥有"托管资源"在需要时自动重新加载(这是默认设置)。

如果您的情况过于复杂,只需删除static关键字就更容易了。这通常也会迫使您拥有更好的OO设计,而不是使用快捷方式,例如单身模式,从长远来看通常会导致其他问题。

答案 1 :(得分:0)

创建新的静态变量或只是将值分配给内存中的旧静态变量

仅按a方法将值分配给bresume()

静态变量仅在执行开始时初始化一次。

修改

您正在创建Player的新对象并分配给player引用变量。之后你没有旧玩家对象的引用所以当JVM觉得需要运行垃圾收集器时,垃圾收集器会运行并清除旧玩家对象的内存。