Android API for asynkron logikk, AsyncTask, er på vei ut. I følge en AOSP-forpliktelse vil API-en bli avviklet i Android 11.
I mange år har Androids AsyncTask vært et stiftverktøy for både nybegynnere og ekspertutviklere. Hvis du noen gang har googlet en veiledning for noen form for asynkron logikk i Android, er sjansen stor for at de første resultatene antyder bruk av AsyncTask. Det er ikke slik at dette er et tilfeldig valg heller. AsyncTask ble opprinnelig opprettet for å forenkle interaksjonen mellom bakgrunnsoperasjoner og en applikasjons brukergrensesnitt. En stund gjorde det det bra. AsyncTask hjelper virkelig med å forenkle asynkrone oppgaver. Det betyr ikke at det er perfekt.
En ting mange applikasjoner må gjøre er å hente informasjon fra en ekstern server. Siden nettverksforespørsler kan ta en stund, er det vanligvis viktig å gjøre dem asynkront slik at de ikke får applikasjonen til å fryse. Når operasjonen er fullført, kan brukergrensesnittet oppdateres. Det er imidlertid mulig at den relevante delen av brukergrensesnittet ikke lenger eksisterer når nettverksforespørselen er fullført, noe som kan forårsake krasj eller andre feil. Mens AsyncTask gjør den generelle prosessen enklere, respekterer den ikke Androids applikasjonslivssyklus. Det betyr at det ikke er noen innebygd beskyttelse mot at en AsyncTask fullfører etter en UI-endring. Selvfølgelig er det mulig å legge til kontroller og annen beskyttelse manuelt, men det legger til mye repetisjonskode (AKA boilerplate). På grunn av problemer som dette har AsyncTask liksom falt i veien. Google har heller ikke gjort mange endringer i hvordan det fungerer.
Vel, det virker som Googles mening er at AsyncTask er hinsides å spare. I en nylig AOSP-commit ble AsyncTask avviklet, med henvisning til lignende grunner som de jeg nettopp snakket om. Selv om dette egentlig ikke er en stor endring for sluttbrukere, kan det bety mye for utviklere. Hvis du vedlikeholder en eldre kodebase, eller du nettopp har startet med asynkrone oppgaver i Android, må du sannsynligvis endre en haug med kode. Heldigvis har Google imidlertid ikke latt utviklere ligge i støvet.
På grunn av AsyncTasks begrensninger har det dukket opp alternativer over tid, slik som RxJava og Kotlins nye (ish) Coroutines-bibliotek. Disse alternativene har en tendens til å ha mye mer fleksibilitet og funksjoner enn AsyncTask, så de har fått en del popularitet. I sin avviklingsmelding for AsyncTask anbefaler Google å bruke Javas Concurrency-rammeverk eller Kotlin Coroutines.
Personlig har jeg allerede begynt å bruke Kotlins Coroutines, og har ikke sett meg tilbake. Selvfølgelig vet jeg at mange har integrert koden sin tett rundt AsyncTask, så dette er nok i det minste en liten ulempe for dem. Det er bra at det er mange alternativer å velge mellom. Det kan være irriterende å endre koden din, men det er i det minste mulig denne gangen.
Hvis du vil ha flere detaljer, kan du sjekke ut forpliktelsen her. Forpliktelsen ble slått sammen tidligere i dag, og med mindre det er en Android-vedlikeholdsutgivelse i pipelinen, vil vi se denne endringen gjenspeiles i Android 11 neste år.