为什么这些代码使我的应用程序在onPause和onResume时停止



我有这样一个类

class C
{
    MainActivity mainActivity;
    boolean isPaused;
    public void A()
    {
        B b = new B()
        {
            public void run()
            {
                isDone = true;
            }
        };
        mainActivity.runOnUiThread(b);
        while(!b.isDone && !isPaused)
        {
            try { Thread.sleep(1); }
            catch(Exception e)
            {
                e.printStackTrace();
                break;
            }
        }
    }
}

abstract class B implements Runnable
{
    public boolean isDone = false;
}

然后在实现GLSurfaceViewRenderer的渲染器中调用它

@Override
public void onDrawFrame(GL10 gl)
{
    c.A();
}

c是c的实例,当调用自身的onPause和onResume时,mainActivity调用GLSurfaceView.onPuse和onResume。它还将isPaused设置为c。GLSurfaceView的onPause和onResume只是调用其super的onPauseonResume。

然后,当调用onPause和onResume时,我的应用程序被冻结。为了找到问题,我删除了除了我解释的代码之外的其他代码,但它仍然存在。我该怎么修?

onDrawFrame正在UI线程上执行。您正在无限期地阻塞线程,因为您永远不会让!b.isDone && !isPaused求值为false。您永远不应该在主UI线程上调用Thread.sleep()

编辑:实际上我错了。渲染器是从一个单独的线程调用的,以防止UI线程上出现这样的块。但是,在两个线程之间共享一个变量(isDone(仍然存在问题。这可以通过使isDone成为volatile来克服。

相关内容

  • 没有找到相关文章

最新更新