Получение ANR, когда GLThread очень занят и приложение находится в фоновом режиме - PullRequest
0 голосов
/ 24 августа 2018

Я заметил следующее странное поведение, когда мой GLThread выполняет интенсивную работу.

Запустите приложение и дождитесь, пока GLThread выполнит интенсивную задачу.Отправка приложения в фоновый режим. Отправка push-уведомления из firebase. Подождите, пока не появится ANR (поскольку приложение не может активировать службу уведомлений)

Если вместо отправки приложения в фоновый режим я просто подожду с приложением на переднем плане,уведомление приходит, а ANR не отображается.

Теоретически GLThread не является основным потоком, поэтому я мог бы выполнять любую работу там без получения ANR.

Вымой проект можно найти здесь: https://issuetracker.google.com/issues/113119768

Чтобы воспроизвести мою "интенсивную работу", я просто поместил бесконечный цикл в функцию onDrawFrame

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    while(true)
    {
        Log.e("GLThread", "draw");
    }
}

Любая помощь будет очень признательна.

  • Элемент списка

1 Ответ

0 голосов
/ 24 августа 2018

Проблема заключается в том, что этот бесконечный цикл обратного вызова onDrawFrame (), при таком действии вы блокируете поток GL.

Я предполагаю, что поток GL происходит из GLSurfaceView или подобного?Вы должны понимать, что вы не можете поместить бесконечный цикл в этот метод.Функция onDrawFrame () - это просто обратный вызов, запускаемый потоком GL каждый раз, когда поверхность готова рисовать новый кадр.Если вы не разрешите продолжить обратный вызов, то вы блокируете поток GL.

Таким образом, помимо запрета продолжения рабочего процесса, другие потоки, взаимодействующие с потоком GL, также будут заблокированы.Например, когда поток пользовательского интерфейса сообщает GLSurface об остановке, что в таком случае вызовет ANR, поскольку метод onDrawFrame () удерживает текущую блокировку синхронизации GL из-за бесконечного цикла.

...