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

标签 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 时,它是否会从内存中删除?

最佳答案

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

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

也就是说,请注意 pauseresume 方法不是执行此类操作的正确方法。事实上,由于上​​述原因,您根本不应该将 static 关键字用于特定于应用程序一个实例的事物,除非您正确管理这些 static 引用。例如,libgdx 通过保留应用程序实例及其使用的资源的映射在幕后执行此操作。这允许您拥有“托管资源”,这些资源会在需要时自动重新加载(这是默认设置)。

在您的情况下,这会使事情变得过于复杂,并且简单地删除 static 关键字会更容易。这通常也会迫使您拥有更好的 OO 设计,而不是使用诸如以下之类的快捷方式:从长远来看,单例模式通常也会导致其他问题。

关于java - 静态变量、libgdx 和 android 暂停/恢复内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44351204/

相关文章:

model - 如何在 libgdx 中先缩放然后旋转模型实例

Java libGDX 一砖一瓦平滑移动

java - 使用 NumberLong 在 mongodb 中创建查询时出现问题

android - Android PhoneGap 中的自定义字体

android - 无法覆盖 onBackPressed 和 onKeyDown - Android

java - 仅使用 Java 从数据库填充微调器?

java - Libgdx 将一个 Actor 的 Action 传递给另一个 Actor

java - JXTreeTable : how to use ComponentProvider to set the renderer for one column

java - 如何使用joda time在java中将字符串转换为日期时间

java - 我的模型类或其他类中应该有逻辑吗