android - 当应用程序进入后台时暂停线程

标签 android multithreading

我想在应用程序进入后台时暂停线程,并在应用程序进入前台时恢复线程。但是返回到前台后线程正在运行但 UI 不会对输入使用react,并且在一段时间后 Activity 崩溃并且没有错误消息并且应用程序重新启动到主 Activity 。线程运行时不会调用 onResume()。

这是我得到的:

在 Activity 中:

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

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

}

Canvas 扩展表面 View :

@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();
            }
        }

最佳答案

synchronized (mPauseLock) 锁定 mPauseLock

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

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

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

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

中的同步块(synchronized block)

关于android - 当应用程序进入后台时暂停线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450684/

相关文章:

java - 从 Realm 数据库查询中获取变音符号不敏感的结果

Android 屏幕密度 dpi 与 ppi

java - Android Java改变程序中的主题

java - 为什么我会收到 .jar 文件的所有这些错误 "cannot resolve symbol R"和 "Content is not allowed in prolog"?

multithreading - 使用带有 make 标志 -pthread 的 std::thread 和使用 pthread.h 库有什么区别

C# - 线程中止和 System.NullReferenceException

multithreading - 是否可以使用 AsyncCalls 单元创建线程池?

java - 执行器服务invokeAll

java - 尝试在本地存储上读取/写入时出现 ".txt file not found"- Libgdx,Android studio

java - 当其他线程访问同步块(synchronized block)时,一个线程等待多长时间?