当应用程序转到后台时暂停线程

时间:2015-02-11 09:26:35

标签: android multithreading

我想在应用程序转到后台时暂停线程,并在应用程序到达前台时恢复它。但是在返回到前台线程后正在运行但是UI没有对输入作出反应,并且在一段时间之后活动崩溃而没有错误消息并且应用程序重新启动到主要活动。线程运行时不调用onResume()。

这就是我所拥有的:

在活动中:

 @Override
public void onPause() {
    super.onPause();
    if (running) {
        canvas.getEngine().onPause();
    }
}

@Override
public void onResume() {
    super.onResume();
    if (running) {
        canvas.getEngine().onResume();
    }

}

Canvas扩展了表面视图:

@Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        if (!engine.isRunning()) {
            engine.setRunning(true);
            engine.start();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        boolean retry = true;

        while (retry) {
            try {
                engine.join();
                retry = false;
            }
            catch (InterruptedException e) {

            }
        }
    }

和引擎扩展线程:

private boolean mPaused;
private Object mPauseLock;
        @Override
            public void run() {

        //bla bla

        synchronized (mPauseLock) {
                        while (mPaused) {
                            try {
                                mPauseLock.wait();
                            } catch (InterruptedException e) {
                            }
                        }
                    }
                }

      public void onPause() {
            synchronized (mPauseLock) {
                mPaused = true;
            }
        }

        /**
         * Call this on resume.
         */
        public void onResume() {
            synchronized (mPauseLock) {
                mPaused = false;
                mPauseLock.notifyAll();
            }
        }

1 个答案:

答案 0 :(得分:1)

synchronized (mPauseLock)锁定

中的mPauseLock
synchronized (mPauseLock) {
                while (mPaused) {
                    try {
                        mPauseLock.wait();
                    } catch (InterruptedException e) {
                    }
                }
            }
        }

当调用resume时,下面的代码被锁定,更糟糕的是,它会锁定主线程。

synchronized (mPauseLock) {
    mPaused = false;
    mPauseLock.notifyAll();
}

所以你只需要删除run();

中的同步块