第二次运行Android应用程序的问题

时间:2010-11-27 00:08:48

标签: java android andengine

我是Android新手,开发基于AndEngine的小游戏(www.andengine.org)。

游戏显示背景的平铺地图,具有不同类型的平铺(一些可移动,一些可旋转)。我还在屏幕上画了几行。

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

我已经阅读了我在应用程序生命周期中可以找到的所有内容,并尝试在onDestroy()方法中将各种对象设置为null,但我没有做任何改变。从第一次应用程序运行开始,某些东西显然“徘徊”,并在第二次启动时引发问题。请帮助,24小时的谷歌搜索和破坏我的大脑是徒劳的。

谢谢, 史蒂夫

P.S。在模拟器中运行时的行为相同。

更新:

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

我创建了一个小程序来调查上述问题的一部分,绘制一条线,而不是在重新运行应用程序时绘制。

使用AndEngine必须覆盖onLoadScene()。在此方法中,您可以在启动时在屏幕上指定所需内容,该方法将返回Scene对象。场景处理你在屏幕上看到的内容,因此如果你想说,在屏幕上添加一个新行(或精灵,或其他),你可以调用myScene.addEntity(myLine)。我创建了一个主活动类和一个名为MyLine的类来绘制线。

我的主要活动:

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的新手。 我的活动只使用一个场景,所以我想,在我的MyLine类中,我可以将SCENE声明为静态final,因为它不会改变。错误! 调试程序我发现静态最终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.

我怀疑我的游戏应用程序的其他问题都与将它们声明为静态或静态最终结果有关。

在决定应该使用哪种类型的变量(和方法)时,是否有可用的经验法则?

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

第一次应用程序运行时显然有些“徘徊”,并且在第二次启动时会出现问题。

您是否创建了自己的Application子类?如果您正在应用程序级别对游戏进行一些初始化,然后在活动级别进行其他初始化,那么前者将不会重复,直到应用程序本身被杀死并重新启动。只需退出使用BACK按钮不会直接杀死应用程序。

答案 2 :(得分:0)

小心使用静态最终变量!!! 解决我上面的问题。

答案 3 :(得分:-2)

我也遇到了这个问题,我通过删除一些静态变量和静态方法来解决它。我知道静态变量将在android中单击后退按钮时留在内存中,但我仍然不知道为什么效果如此奇怪。 还要感谢上面的每个人!