当GLThread非常忙并且应用程序处于后台时,获取ANR

时间:2018-08-24 13:05:44

标签: android opengl-es background android-anr-dialog

当我的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

任何帮助将不胜感激。

  • 列表项

1 个答案:

答案 0 :(得分:0)

问题在于onDrawFrame()回调存在无限循环,通过这种操作您将GL线程锁定了。

我猜想GL线程来自GLSurfaceView还是类似的?您必须了解,不能在此方法中放置无限循环。每当表面准备好绘制新框架时,onDrawFrame()函数只是由GL线程触发的回调。如果您不允许回调继续进行,那么您将阻塞GL线程。

因此,除了不允许工作流继续进行之外,与GL线程通信的其他线程也将被锁定。例如,当UI线程告诉GLSurface停止时,由于无限循环,onDrawFrame()方法将保持当前的GL同步锁,这将导致ANR。