我为什么得到:threadid = 3:对信号3和游戏冻结(AndEngine)作出反应?

时间:2012-07-02 22:49:24

标签: android multithreading andengine freeze

我正在使用AndEngine制作一款可以处理大量移动精灵的游戏。它是不一致的,但最终我在log cat中得到一条消息(threadid = 3:对信号3作出反应)并且游戏冻结了。这个错误是什么意思?我已经缩小了它发生的代码(标记为):

private void levelComplete(){
        runOnUiThread(new Runnable() {
            public void run() {
                 Toast.makeText(TestGFX5Activity.this, "Level Complete", Toast.LENGTH_SHORT).show();
            }
        });
        Log.e("Level Complete","Going to reset values");
        //Reset values
        level++;
        fillerCount = (originalNumberOfFillers + level - 1);
        areaFilled=0;
        fillAreaPercent = 0;

        //Rid scene of sprites
        for(int x=0;x<=fillerNum;x++){  
            filler[x].body.setActive(false);
            scene.detachChild(filler[x].sprite);
            filler[x].active=false;
            filler[x].scale=originalSpriteScale;
            filler[x].body.setUserData("inactive");
        }
        levelText.setText("Level: "+Integer.toString(level));
        fillersLeftText.setText("Balls left: "+Integer.toString(fillerCount));
        percentFilledText.setText("0%");
        fillerNum = -1;

        Log.e("Level Complete","values reset");

        randx = random.nextInt(650) + 25;
        randy = random.nextInt(400) + 25;
        randix = random.nextInt(10);
        randiy = random.nextInt(10);
        if(randix%2==0)
            ix = 5;
        else
            ix = -5;
        if(randiy%2==0)
            iy = 5;
        else
            iy = -5;

        Log.e("Level Complete","Creating destroyer"); //This line executes
        destroyer = new Ball(randx, randy, destroyerTR, getVertexBufferObjectManager(), ix, iy); //Code breaks here (*sometimes*)
        Log.e("Level Complete","complete"); //This line does not
    }

最奇怪的是,在崩溃之前,代码的工作方式是4/5次(我通常可以升级3到4次,最多9次)。我不确定是什么原因造成的。有人有什么想法吗?

2 个答案:

答案 0 :(得分:7)

当ANR条件发生时,Android Runtime会向所有dalvik VM发送信号3,以使它们转储其堆栈跟踪以生成ANR报告。 strack trace的转储将导致dalvik暂时暂停你的应用程序。

我建议您查看ANR的logcat(事件和主缓冲区)。还要检查/ data / anr以获取ANR跟踪以检查导致问题的原因。

答案 1 :(得分:1)

通过检查/data/anr/traces.txt文件,您可以找到是否存在数十个线程,这可能是您的应用程序被冻结的原因。