Android API för asynkron logik, AsyncTask, är på väg ut. Enligt ett AOSP-åtagande kommer API: et att fasas ut i Android 11.
I flera år nu har Androids AsyncTask varit ett basverktyg för både nybörjare och expertutvecklare. Om du någonsin har googlat en handledning för någon form av asynkron logik i Android, är chansen stor att de första resultaten tyder på att du använder AsyncTask. Det är inte som att det här är ett slumpmässigt val heller. AsyncTask skapades ursprungligen för att förenkla interaktionen mellan bakgrundsoperationer och en applikations användargränssnitt. Ett tag gick det bra. AsyncTask hjälper verkligen till att förenkla asynkrona uppgifter. Det betyder dock inte att det är perfekt.
En sak som många applikationer behöver göra är att hämta information från en fjärrserver. Eftersom nätverksförfrågningar kan ta ett tag är det vanligtvis viktigt att göra dem asynkront så att de inte får programmet att frysa. När operationen är klar kan användargränssnittet uppdateras. Det är dock möjligt att den relevanta delen av användargränssnittet inte längre existerar när nätverksförfrågan är klar, vilket kan orsaka krascher eller andra buggar. Även om AsyncTask gör den övergripande processen enklare, respekterar den inte Androids applikationslivscykel. Det betyder att det inte finns något inbyggt skydd mot att en AsyncTask avslutas efter en gränssnittsändring. Naturligtvis är det möjligt att manuellt lägga till kontroller och andra skydd, men det lägger till en hel del upprepningskod (AKA boilerplate). På grund av problem som detta har AsyncTask liksom fallit i vägen. Google har inte heller gjort många ändringar i hur det fungerar.
Tja, det verkar som att Google anser att AsyncTask är bortom att spara. I en nyligen genomförd AOSP-commit avfasades AsyncTask, med hänvisning till liknande skäl som de jag just pratade om. Även om detta egentligen inte är en stor förändring för slutanvändare, kan det betyda mycket för utvecklare. Om du underhåller en äldre kodbas eller om du precis har börjat med asynkrona uppgifter i Android, kommer du sannolikt att behöva ändra en massa kod. Men lyckligtvis har Google inte lämnat utvecklarna i dammet.
På grund av AsyncTasks begränsningar har alternativ dykt upp med tiden, som RxJava och Kotlins nya (ish) Coroutines-bibliotek. Dessa alternativ tenderar att ha mycket mer flexibilitet och funktioner än AsyncTask, så de har vunnit en hel del popularitet. I sitt meddelande om utfasning av AsyncTask rekommenderar Google att du använder Javas Concurrency-ramverk eller Kotlin Coroutines.
Själv har jag redan börjat använda Kotlins Coroutines, och har inte tittat tillbaka. Naturligtvis vet jag att många människor har integrerat sin kod tätt runt AsyncTask, så detta är förmodligen åtminstone ett litet besvär för dem. Det är bra att det finns många alternativ att välja mellan. Det kan vara irriterande att ändra din kod, men det är åtminstone möjligt den här gången.
Om du vill ha mer information kan du kolla in commit här. Åtagandet slogs samman tidigare idag, och om det inte finns en Android-underhållsrelease på gång, kommer vi att se denna förändring återspeglas i Android 11 nästa år.