【问题标题】:Why these code make my application be stopped when onPause and onResume?为什么这些代码使我的应用程序在 onPause 和 onResume 时停止?
【发布时间】:2015-07-09 17:58:38
【问题描述】:

我有这样的课

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,mainActivity 在调用自身的 onPause 和 onResume 时调用 GLSurfaceView.onPause 和 onResume。它还设置了 c 的 isPaused。 GLSurfaceView 的 onPause 和 onResume 只是调用它的 super 的 onPause 和 onResume。

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

【问题讨论】:

    标签: android onresume onpause


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。但是,我必须等待 b,因为必须为每个 onDrawFrame 调用它。如何在不阻塞 UI 线程的情况下做到这一点?
    • b 将要做什么?该代码似乎没有显示其背后的真实逻辑。如果它是一个长时间运行的进程,则不应在 UI 线程上完成。
    • 在 b 中,我通过调用 GoogleMap.getProjection().getVisibleRegion().latLngBounds 来绑定 googlemap。
    • 只能在UI Thread中调用,所以我使用了mainActivity.runOnUiThread(b)
    • 哦,那么,onDrawFrame是在GLThread上执行的,而不是在UI线程上执行的?
    猜你喜欢
    • 2014-03-31
    • 2011-01-05
    • 2015-04-11
    • 1970-01-01
    • 2014-08-07
    • 2018-08-12
    • 2018-08-03
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多