当我的GLThread进行大量工作时,我注意到以下奇怪的行为。
启动应用程序,然后等待GLThread完成繁重的任务。 将应用程序发送到后台 从Firebase发送推送通知 等待直到ANR出现(因为应用程序无法唤醒通知服务)
如果不是将应用程序发送到后台,而是在前台等待应用程序,则通知会到达并且ANR不会显示。
理论上GLThread不是主线程,因此我应该能够在那里进行任何形式的工作而无需获得ANR。
您可以在这里找到我的项目: https://issuetracker.google.com/issues/113119768
为了重现我的“繁重的工作”,我只是在onDrawFrame函数上设置了无限循环
#!/bin/sh
export GIT_WORK_TREE=/home/me/apps/app
echo "Checking out changes..."
git --work-tree=$GIT_WORK_TREE --git-dir=/home/me/repos/repo.git
checkout -f
echo "Yarn install..."
cd $GIT_WORK_TREE
unset GIT_WORK_TREE
yarn install
任何帮助将不胜感激。
答案 0 :(得分:0)
问题在于onDrawFrame()回调存在无限循环,通过这种操作您将GL线程锁定了。
我猜想GL线程来自GLSurfaceView还是类似的?您必须了解,不能在此方法中放置无限循环。每当表面准备好绘制新框架时,onDrawFrame()函数只是由GL线程触发的回调。如果您不允许回调继续进行,那么您将阻塞GL线程。
因此,除了不允许工作流继续进行之外,与GL线程通信的其他线程也将被锁定。例如,当UI线程告诉GLSurface停止时,由于无限循环,onDrawFrame()方法将保持当前的GL同步锁,这将导致ANR。