为什么我收到“threadid=3: reacting to signal 3 and game freeze (AndEngine)”的提示并出现游戏冻结?

10

我正在使用AndEngine制作一个涉及大量移动精灵的游戏。有时会出现不一致的情况,但最终我会在日志中收到一条消息(threadid = 3:reacting to signal 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次),然后才会崩溃。我不确定是什么原因导致了这种情况。有人有任何想法吗?


我遇到了同样的问题。你是如何解决它的? - Ricardo
2个回答

9
当ANR条件发生时,Android运行时会向所有dalvik VM发送信号3,以导致它们转储堆栈跟踪以生成ANR报告。堆栈跟踪转储将导致dalvik暂时挂起您的应用程序。
我建议您查看logcat(事件和主要缓冲区)中的ANR。还要检查/data/anr以获取ANR跟踪信息,以查明问题的原因。

我得到了traces.txt文件,但是我无法找出原因。你能告诉我如何使用traces.txt文件找出导致ANR的原因吗?谢谢。 - Hilal
1
你需要先检查主线程的堆栈跟踪。检查堆栈顶部的方法是否可能需要更长时间才能执行,因为它正在调用某些阻塞方法(如I/O),进行一些密集的计算,被困在循环或无限递归中,甚至正在等待另一个线程持有的某些资源,例如锁、监视器、数据库访问等等。 - André Oriani

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接