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

时间:2015-07-09 17:58:39

标签: android onresume onpause

我有这样一个班级

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;
}

然后在渲染器中调用它来实现GLSurfaceView.Renderer

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

c是instanceof C,当onPause和onResume自身被调用时,mainActivity调用GLSurfaceView.onPause和onResume。它还设置了isPaused of c。 GLSurfaceView的onPause和onResume只调用它的超级onPause和onResume。

然后当onPause和onResume调用时,我的应用程序被冻结了。为了找到问题,除了我解释的内容之外,我删除了其他代码,但它仍然会发生。 我该如何解决?

1 个答案:

答案 0 :(得分:3)

正在UI线程上执行

onDrawFrame。您无限期地阻止该线程,因为您永远不会将!b.isDone && !isPaused评估为false。你永远不应该在主UI线程上调用Thread.sleep()

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