Java 游戏循环没有破坏

Java 游戏循环没有破坏,java,android,Java,Android,背景 我已经创建了一个游戏循环来运行UI,但是当我从游戏屏幕SingleGameActivity按下后退按钮时,我会进入名为StartVActivity的级别选择器菜单。如果我试图重新进入游戏或从StartVActivity按下后退按钮,我会收到keyDispatchingTimedOut错误ANR。 当我写日志消息时,游戏活动SingleGameActivity只是暂停了,当我按下后退按钮时,它没有停止。当我结束活动时,游戏循环从未被破坏 问题 1.为什么当我按下游戏菜单上的后退按钮时,游戏循

背景 我已经创建了一个游戏循环来运行UI,但是当我从游戏屏幕SingleGameActivity按下后退按钮时,我会进入名为StartVActivity的级别选择器菜单。如果我试图重新进入游戏或从StartVActivity按下后退按钮,我会收到keyDispatchingTimedOut错误ANR。 当我写日志消息时,游戏活动SingleGameActivity只是暂停了,当我按下后退按钮时,它没有停止。当我结束活动时,游戏循环从未被破坏

问题 1.为什么当我按下游戏菜单上的后退按钮时,游戏循环没有被破坏?我的意思是,当onPaused被调用时,为什么不调用surfaceDestroyed呢?onStop从未被调用过,我不知道为什么

如何访问/data/anr/traces.txt

我如何处理这些错误

如果您能回答这些问题中的任何一个,我将不胜感激

编辑

这是一个surface view类,我从这里开始并销毁线程,或者看起来我只是在启动它,因为当我按下back按钮时它不会关闭

@Override
public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
    Log.d(TAG, " surface created");
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    while (retry) {
        try {
            thread.join();
            retry = false;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    Log.d(TAG, " surface destroyed");
}
编辑2与解决方案

通过更改这段代码修复了该错误:

boolean retry = true;
while (retry) {
    try {
        thread.join();
        retry = false;
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
为此:

thread.setRunning(false);
为什么??
是因为我需要在销毁线程之前停止线程吗?

你从哪里进入游戏循环?也许运行游戏循环的同一个线程负责停止你的应用程序,但它不能,因为它被困在游戏循环中?我对线程不是很熟悉,因为我是一个初学者,但如果你能教我如何解决这个问题,我会很高兴的!:Thread.join将等待线程退出。但是如果它自己不打算退出,并且您没有向它发送任何信号,那么它就不会退出,而名为thread.join的主线程将永远等待另一个线程。好的!那么,我是否以正确的方式解决了这个问题?通过添加thread.setRunningfalse?它至少工作得很好:取决于thread.setRunningfalse的功能。如果它向游戏循环线程发出退出游戏循环并完成的信号,那么应该可以工作。尝试在surfaceDestroyed开始之前的代码之前添加thread.setRunningfalse,看看是否有效。让主线程在surfaceDestroyed after循环结束时加入游戏循环线程后打印日志消息。如果打印,则可以确保游戏循环线程已退出,并且主循环已退出循环,即未被卡住。
thread.setRunning(false);