У меня есть 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);
}
}