Kaip padeda Handler vykdyti užduotis sinchroniškai?
sobes.tech AI
Atsakymas iš AI
Handler neskatina vykdyti užduotis sinchroniškai. Jis naudojamas siųsti ir apdoroti žinutes (Message) ir Runnable objektus, susijusius su tam tikru Looper, kuris dažniausiai yra susietas su gija.
Pagrindinis Handler tikslas yra palengvinti asinchroninį sąveiką tarp gijų, pavyzdžiui, UI atnaujinimą iš foninės gijos.
Užduotys, siunčiamos per Handler, yra įdedamos į MessageQueue eilę susietame Looper ir apdorojamos nuosekliai toje gijoje, kuriai priskirtas Looper. Ši apdorojimo seka vienoje gijoje gali sukurti iliuziją apie tvarką, bet nėra tikra sinchronizacija, vykdoma blokuojančiose operacijose tarp gijų.
Siekiant sinchroninio vykdymo ar laukiant užduoties rezultato kitoje gijoje, naudojami kiti mechanizmai:
- Blokuojantys iškvietimai (nerekomenduojami UI gijai).
Future/CompletableFuture.CountDownLatch.Semaphore.- Kotlin kalbos konstrukcijos, pavyzdžiui,
runBlocking(naudoti atsargiai).
Pavyzdys naudojant Handler'į asinchroninei užduočiai (UI atnaujinimas):
// Apibrėžiame Handler'į, susietą su pagrindine gija
val uiHandler = Handler(Looper.getMainLooper())
// Atlikti ilgą operaciją foninėje gijoje
Thread {
// Ilgo darbo simuliacija
Thread.sleep(2000)
// Siųsti Runnable į pagrindinės gijos Handler eilę
uiHandler.post {
// Šis kodas vykdomas pagrindinėje gijoje, galima atnaujinti UI
textView.text = "Darbas baigtas!"
}
}.start()