Saya memiliki TextureView yang menggunakan utas latar belakang untuk melukis konten secara berkala.

Ini semua berfungsi dengan baik sebagian besar waktu, tetapi saya telah menemukan bahwa ketika menggulir TextureView ini dari layar yang terlihat dan kembali kadang-kadang menyebabkan isAvailable menjadi salah dan lockCanvas mengembalikan nol. Saya tidak tahu apakah ini tentang menggulirnya ke/tidak terlihat dengan cepat adalah masalahnya, atau yang lainnya.

Saya memiliki TextureViewListener yang terpasang dan onSurfaceTextureAvailable dipanggil dan isAvailable mengembalikan nilai true dari sana. Namun, ketika utas latar belakang mencoba merender hanya beberapa milidetik setelah itu, isAvailable salah dan lockCanvas mengembalikan nol, sehingga tidak dapat menggambar.

Terkadang menggulir kontrol kembali dari layar dan kembali ke tampilan lagi memperbaiki masalah dan akan mengecat ulang lagi. Saya tidak dapat menemukan penjelasan untuk perilaku khusus ini di mana pun, dan tidak ada pertanyaan lain di Stack Overflow yang tampaknya membahas hal ini.

Ini terjadi pada setidaknya Android 7 dan 9 di beberapa perangkat. Reproduksi tidak 100%, tetapi setelah beberapa kali mencoba, itu selalu terjadi.

Utas latar belakang hanya mengulang kode ini:

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);
    }
}
0
g01d 25 Maret 2019, 20:42

1 menjawab

Jawaban Terbaik

Saya memecahkan ini dengan panggilan tertunda singkat ke requestLayout(). Untuk alasan apa pun, meskipun onSurfaceTextureAvailable dipanggil dan melaporkan tekstur sebagai tersedia, itu tidak segera setelahnya. Meminta tata letak baru dengan sedikit penundaan akan memperbaiki masalah.

0
g01d 11 April 2019, 16:26