TextureView isAvailable иногда ложно при прокрутке в и из поля зрения - PullRequest
0 голосов
/ 25 марта 2019

У меня есть TextureView, которое использует фоновый поток для рисования контента через регулярные промежутки времени.

В большинстве случаев это работает хорошо, но я обнаружил, что при прокрутке этого TextureView за пределы видимого экрана и его повторного запуска иногда isAvailable становится false, а lockCanvas возвращает null. Я не знаю, если это вопрос быстрой прокрутки в / из поля зрения, это проблема, или что-то еще.

У меня есть присоединенный TextureViewListener, и onSurfaceTextureAvailable действительно вызывается , и isAvailable возвращает true оттуда. Однако, когда фоновый поток пытается отобразить всего несколько миллисекунд после этого, isAvailable имеет значение false, а lockCanvas возвращает значение NULL, поэтому он не может рисовать.

Иногда прокрутка элемента управления обратно с экрана и возврат в поле зрения снова исправляет проблему, и он снова перерисовывается. Я нигде не могу найти объяснения этому конкретному поведению, и никакой другой вопрос о переполнении стека, кажется, не решает эту проблему.

Это происходит как минимум на Android 7 и 9 на нескольких устройствах. Воспроизведение не 100%, но после некоторого количества попыток это всегда происходит.

Фоновый поток просто зацикливает этот код:

Canvas c = null;
try {
    synchronized (this) {
        c = lockCanvas(null);
        render(c); // <-- does some drawing when c is not null
    }
} finally {
    if (c != null) {
        unlockCanvasAndPost(c);
    }
}

1 Ответ

0 голосов
/ 11 апреля 2019

Я решил это с помощью короткого отложенного вызова requestLayout (). По какой-то причине, даже если onSurfaceTextureAvailable вызывается и сообщает о текстуре как доступной, это происходит не сразу после этого. Запрос нового макета с небольшой задержкой устраняет проблему.

...