Junior
Cum se declanșează reimprimarea unei vederi personalizate în Android?
sobes.tech AI
Răspuns de la AI
Există mai multe moduri de a invalida (invalidate) o vedere personalizată:
-
invalidate():
- Regridă întreaga vedere.
- Planifică apelul la
onDraw(). - Se folosește pentru o reîmprospătare simplă fără a specifica o zonă anume.
// În interiorul vederii tale sau la interacțiunea cu ea myCustomView.invalidate() -
invalidate(Rect dirty) sau invalidate(int left, int top, int right, int bottom):
- Regridă doar zona specificată a vederii.
- Este mai optim dacă modificările afectează doar o parte a vederii.
// Regridă zona cu coordonatele (10, 20) până la (100, 150) myCustomView.invalidate(10, 20, 100, 150) // Sau cu Rect val dirtyRect = Rect(10, 20, 100, 150) myCustomView.invalidate(dirtyRect) -
postInvalidate():
- Este sigur să fie apelat din orice fir, inclusiv din fire de fundal.
- Plasează operația
invalidate()în coada de mesaje pentru execuție pe firul UI.
// Dintr-un fir de fundal Thread { // Efectuează calcule lungi // ... myCustomView.postInvalidate() }.start()
Compararea între invalidate() și postInvalidate():
| Metodă | Fir de execuție | Sigur din fir de fundal | Scop |
|---|---|---|---|
invalidate() |
Fir UI | Nu | Regridare imediată (cât mai mult posibil în firul UI) |
postInvalidate() |
Fir UI | Da | Regridare întârziată prin coada de mesaje |
Relația cu onDraw():
Apelarea oricărei metode invalidate(...) planifică executarea metodei onDraw() a vederii tale. Sistemul Android combină mai multe solicitări de invalidare într-una singură, dacă este posibil, pentru a optimiza performanța. onDraw() este apelată doar atunci când sistemul este gata pentru a re- desena.
Când să folosiți fiecare metodă:
- Folosiți
invalidate()când sunteți în firul UI (de exemplu, într-un handler de clic, după o animație) și modificările afectează întreaga vedere sau nu vă pasă de optimizarea pe zonă. - Folosiți
invalidate(Rect)sauinvalidate(int, int, int, int)pentru optimizare dacă modificările afectează doar o parte a vederii și sunteți în firul UI. - Folosiți
postInvalidate()când trebuie să apelați invalidate dintr-un fir de fundal. - Nu apelați
invalidate()saupostInvalidate()prea des fără motiv, deoarece poate afecta performanța. Apelați-le doar după modificări ale datelor sau stării vederii care necesită o actualizare vizuală.