程序示例:
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
的引用并不意味着内存实际上已被释放。只有当没有其他引用同一对象并且垃圾收集器运行时,该对象才会被删除。
也就是说,请注意 pause
和 resume
方法不是执行此类操作的正确方法。事实上,由于上述原因,您根本不应该将 static
关键字用于特定于应用程序一个实例的事物,除非您正确管理这些 static
引用。例如,libgdx 通过保留应用程序实例及其使用的资源的映射在幕后执行此操作。这允许您拥有“托管资源”,这些资源会在需要时自动重新加载(这是默认设置)。
在您的情况下,这会使事情变得过于复杂,并且简单地删除 static
关键字会更容易。这通常也会迫使您拥有更好的 OO 设计,而不是使用诸如以下之类的快捷方式:从长远来看,单例模式通常也会导致其他问题。
关于java - 静态变量、libgdx 和 android 暂停/恢复内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44351204/