Kung nagtatrabaho ka sa pagbuo ng Android app, tiyak na napagtanto mo na ang pamamahala ng mga asynchronous na gawain ay maaaring maging isang tunay na sakit ng ulo kung hindi gagawin nang maingat. Mga coroutine ni Kotlin Naparito sila upang iligtas ang ating mga buhay, na nagpapahintulot sa atin na magsulat ng code na tila linear ngunit tumatakbo sa background, na pumipigil sa pag-freeze ng application at sa pagkadismaya ng user.
Para maiwasan ang lahat ng ito na magtapos sa isang sakuna tumagas ang memorya Para sa mga hindi inaasahang pagsasara, kailangan natin ang tinatawag na Coroutine Scopes. Sa madaling salita, sinasabi nito sa atin kung gaano katagal dapat mabuhay ang isang gawain bago ito maging matalinong iwanan. Sa ganitong diwa, lifecycleScope at viewModelScope Ito ang dalawang haligi na dapat matutunan ng bawat developer upang maging maayos at mahusay ang kanilang app.
Ang ViewModelScope: Ang tagapag-alaga ng lohika ng negosyo
Kung pag-uusapan natin viewModelScopeTinutukoy natin ang isang saklaw na malapit na nakaugnay sa pagkakaroon ng ViewModel. Ang mahika rito ay, sa sandaling masira ang ViewModel (halimbawa, kapag permanenteng umalis ang user sa isang screen), anumang gawain Anumang datos na inilalabas sa lugar na ito ay awtomatikong kakanselahin. Mahalaga ito upang maiwasan ang patuloy na pagproseso ng datos na hindi makikita ninuman.
Para mapagana ito, kailangan mo lang idagdag ang dependency lifecycle-viewmodel-ktxSa pagsasagawa, ito ang mainam na lugar para maglunsad ng mga kahilingan sa database o mga tawag sa API. Kapag ginagamit viewModelScope.launch, tinitiyak mo na ang trabaho ay isinasagawa lamang habang ang Aktibo ang ViewModel, kaya nao-optimize ang paggamit ng baterya at memorya ng device.
LifecycleScope: Ganap na kontrol sa interface
Hindi tulad ng nauna, ang Saklaw ng siklo ng buhay Ito ay direktang nakaugnay sa isang Lifecycle object, tulad ng isang Activity o isang Fragment. Nangangahulugan ito na kung ang Activity ay masisira, ang mga kaugnay na gawain ay mawawala. Ito ang perpektong tool para sa mga operasyon na direktang nakakaapekto sa visual na layer, tulad ng paghahanda ng isang kumplikadong teksto nang asynchronous bago ito ipakita.
Gayunpaman, mayroong isang mahalagang pagkakaiba. Minsan ayaw nating makansela ang gawain sa pamamagitan lamang ng pagsira sa screen, sa halip ay huminto ito kapag hindi ito tinitingnan ng gumagamit. Para diyan, mayroon tayong ulitinSaSiklo ng BuhayAng feature na ito ay isang mahalagang bagay dahil pinapayagan nitong magsimula ang pangongolekta ng data kapag tumatakbo ang app. NAGSIMULA at awtomatikong ihinto ito kapag umabot na ito sa STOPPEDpinipigilan ang app na gumamit ng mga resources sa background.
Pamamahala ng mga Daloy at Estado sa Compose
Kung lumipat ka na sa Jetpack Compose, medyo magbabago ang pamamahala ng daloy ng trabaho. Dito na ito papasok. collectAsStateWithLifecycleAng API na ito ang pinakaligtas na paraan upang i-convert ang isang Flow sa isang estado na mauunawaan ng Compose, na pinamamahalaan ang subscription ayon sa lifecycle ng component. Kung kailangan mong mangolekta ng maraming Flow nang sabay-sabay, maaari mong ideklara maraming baryabol ng estado at titiyakin ng Compose na ang lahat ay tumatakbo nang maayos nang sabay-sabay.
Para sa mga kaso kung saan kailangan mong kalkulahin ang mga halaga nang asynchronously, ang mainam na solusyon ay ang paggamit StateFlow kasama ang stateInPinapayagan nito ang data na makaligtas sa mga pagbabago sa configuration (tulad ng pag-ikot ng screen) salamat sa parameter. Habang Naka-subscribena nagpapanatili sa koneksyon na aktibo sa loob ng ilang karagdagang segundo upang maiwasan ang mga hindi kinakailangang pag-recharge.
Mga dispatcher at ang sining ng hindi pagharang sa pangunahing thread
Kahit anong saklaw ang gamitin mo, kung maglulunsad ka ng isang gawain na masinsinang gumagamit ng resources sa pangunahing thread, maglalaho ang app. Kaya nga may mga saklaw. Mga nagpadala. Ang Dispatchers.Main Ito ay eksklusibo para sa paghawak sa interface; para sa lahat ng iba pa, mayroon tayo ng Mga Dispatcher.IOna-optimize para sa pagbabasa ng file at network, at ang Dispatchers.Default, na siyang kalamnan para sa mga gawaing masinsinang gumagamit ng CPU tulad ng pagproseso ng isang malaking JSON.
Ang pinakamahusay na kasanayan ay ilunsad ang coroutine sa pangunahing thread at pagkatapos ay gamitin withContext para tumalon sa gumaganang threadSa ganitong paraan, maaari kang gumawa ng kahilingan sa network sa I/O at, sa sandaling matapos ito, ang code ay babalik sa pangunahing thread upang i-update ang UI nang hindi hinaharangan ang karanasan ng gumagamit anumang oras.
Mga karagdagang kagamitan at kontrol sa trabaho
Sa tuwing maglulunsad tayo ng coroutine gamit ang launch o async, nakakakuha tayo ng isang TrabahoAng bagay na ito ay parang isang remote control na nagbibigay-daan sa atin na kontrolin ang gawain. Magagamit natin job.join() hintayin itong matapos o trabaho.kanselahin() itigil ang operasyon kung hindi na ito kinakailangan. Mahalagang tandaan na Ang async ay nagbabalik ng isang DeferredNagbibigay-daan ito sa atin na magpatakbo ng maraming gawain nang sabay-sabay at pagkatapos ay kolektahin ang mga resulta nito gamit ang function await().
Kung tungkol naman sa mga tagapagtayo, mayroon tayong sikat na runBlockingPaalala rito: hinaharangan nito ang kasalukuyang thread at samakatuwid ay ipinagbabawal sa production code ng app. Ang tunay na kapakinabangan nito ay nasa kapaligiran ng pagsubok, kung saan kailangan nating matapos ang suspension function bago gumawa ng isang pahayag sa resulta.
Ang pagkakaroon ng malinaw na estratehiya kung saan ilulunsad ang bawat gawain ay pumipigil sa aplikasyon na maging hindi matatag. Sa pamamagitan ng pagsasama-sama ng kapangyarihan ng viewModelScope para sa lohika at Saklaw ng siklo ng buhay Para sa view, kasama ang matalinong paggamit ng mga dispatcher, nakakamit namin ang isang ecosystem kung saan ang mga asynchronous na gawain ay dumadaloy nang hindi lumilikha ng mga memory leak o nakakaapekto sa performance ng device. Ibahagi ang impormasyong ito upang mas maraming tao ang matuto tungkol sa paksa.
