Sobes.tech
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ă:

  1. 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()
    
  2. 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)
    
  3. 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) sau invalidate(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() sau postInvalidate() 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ă.