java - 第二次以上运行 Android 应用程序时出现问题

标签 java android andengine

我是android新手,正在开发一个基于AndEngine(www.andengine.org)的小游戏。

游戏显示一个平铺 map 作为背景,有不同类型的方 block (有些是可移动的,有些是可旋转的)。我还在屏幕上画了一些线。

问题是,当游戏第一次运行时(在手机上运行,​​从 Eclipse 启动)它运行完美但如果我使用手机的 BACK 按钮退出游戏并从手机主屏幕图标重新启动游戏应用程序是非常错误的.线条不再出现在屏幕上,移动和旋转方 block 的功能仅工作一次,然后游戏无法运行。它不会崩溃,但游戏重启导致的错误使其无法使用。

我已经阅读了所有我能找到的关于应用程序生命周期的内容,并尝试在 onDestroy() 方法中将各种对象设置为 null,但我所做的一切都没有任何效果。从第一次应用程序运行开始,某些东西显然“悬而未决”,并在第二次启动时引起问题。请帮忙,24 小时的谷歌搜索和绞尽脑汁都没有结果。

谢谢, 史蒂夫

附言在模拟器中运行时的行为相同。

更新:

我进一步调查了我的代码:

我创建了一个小程序来调查上述问题的一部分,画了一条线,但在重新运行应用程序时没有画出来。

使用 AndEngine 必须重写 onLoadScene()。在此方法中,您指定启动时屏幕上显示的内容,该方法返回一个 Scene 对象。场景处理你在屏幕上看到的内容,所以如果你想说,向屏幕添加一个新行(或 Sprite ,或其他),你调用 myScene.addEntity(myLine)。我创建了一个主要的 Activity 类和一个名为 MyLine 的类来画线。

我的主要 Activity :

public class LineTest extends BaseGameActivity {

@Override
    public Scene onLoadScene() {
        scene = new Scene(1);
        myLine = new MyLine();
        myLine.displayLine();   
        return scene;
    }
}

MyLine 类:

public class MyLine {

    static final Scene SCENE = LineTest.scene;
    static final int LINE_WIDTH = 4;

    Line line = new Line(0,0,0,0);

    public MyLine() {
    }

    public void displayLine() {
        line.setLineWidth(4);
        line.setColor(1f, 0f, 0f);
        line.setPosition(10, 10, 400, 400);
        SCENE.getBottomLayer().addEntity(line); 
    } 

    public void removeLine() {
        SCENE.getBottomLayer().removeEntity(line);
    }
}

您可能会注意到上面的问题,在我看来,我是 Java 和 OOP 的新手。 我的 Activity 只使用一个场景,所以我想,在我的 MyLine 类中,我可以将 SCENE 声明为静态最终,因为它不会改变。错误的! 调试程序我发现静态最终 SCENE 一旦设置,就永远不会改变,即使在程序停止(使用后退键)并重新启动后也是如此。但是,当程序重新启动时,代码 Scene scene = new Scene(1);使用新 ID 创建一个新场景,因此静态最终 SCENE 指向旧场景而不是新场景,因此在新场景中不会创建任何行。

我发现有两个选项可以解决这个问题:

或者:

Scene SCENE = LineTest.scene;

或者:

static Scene SCENE;

在构造函数中:

    SCENE = LineTest.scene; //I could also pass scene as param to 
constructor which may be better OOP practice.

我怀疑我的游戏应用程序的其他问题都与在不应该的情况下将事物声明为 static 或 static final 有关。

在决定变量(和方法)应该是什么类型时,我可以使用经验法则吗?

更新:我的 Game 类中有三个变量声明为 static final,而它们本应只是静态的。将它们更改为静态并在构造函数中分配它们已经解决了所有问题,WOOHOO! {:-)

最佳答案

当它特定于实例时,为什么你的类中还要有一个静态字段?使它成为一个实例变量左右。

您也可以在应用程序打开时手动重置所有静态字段,但这会非常难看。

关于java - 第二次以上运行 Android 应用程序时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4289364/

相关文章:

Java - 带有重音符号的 InetSocketAddress 主机名

android - 添加库时导出android项目时出错

android - 触摸时移除连续生成的 Sprite

java - 读/写二进制结构: how to simplify this code?

java - Android WebView 在 onPageStarted 和 onPageFinished 之间注入(inject) JavaScript

Java:大量的MouseListeners与像素/网格划分相比如何?

android - 将文件保存到手机而不是 SD 卡

android - 减少菜单项之间的空间

c# - java (for android) 和 C# 之间是否有任何转换引用?

Android Tapjoy Offerwall 从不回调