Android API за асинхронна логика, AsyncTask, е на път да излезе. Според ангажимент на AOSP, API ще бъде отхвърлен в Android 11.
Години наред AsyncTask на Android е основен инструмент както за начинаещи, така и за опитни разработчици. Ако някога сте търсили в Google урок за какъвто и да е вид асинхронна логика в Android, шансовете са, че първите няколко резултата предполагат използването на AsyncTask. Това също не е случаен избор. Първоначално AsyncTask е създаден, за да опрости взаимодействието между фоновите операции и потребителския интерфейс на приложението. За известно време се справяше добре. AsyncTask наистина помага за опростяване на асинхронни задачи. Това обаче не означава, че е перфектно.
Едно нещо, което много приложения трябва да направят, е да вземат информация от отдалечен сървър. Тъй като мрежовите заявки могат да отнемат известно време, обикновено е важно да ги правите асинхронно, така че да не причиняват замръзване на приложението. След като операцията приключи, потребителският интерфейс може да бъде актуализиран. Въпреки това е възможно, докато мрежовата заявка завърши, съответната част от потребителския интерфейс вече да не съществува, което може да причини сривове или други грешки. Въпреки че AsyncTask прави цялостния процес по-прост, той не зачита жизнения цикъл на приложението на Android. Това означава, че няма вградена защита срещу завършване на AsyncTask след промяна на потребителския интерфейс. Разбира се, възможно е ръчно да добавите проверки и други защити, но това добавя много повтарящ се код (известен още като шаблон). Заради проблеми като този, AsyncTask е някак отпаднал. Google също не е направил много промени в начина, по който работи.
Е, изглежда, че мнението на Google е, че AsyncTask е извън спестяването. В скорошен ангажимент на AOSP AsyncTask беше отхвърлен, цитирайки причини, подобни на тези, за които току-що говорих. Въпреки че това не е голяма промяна за крайните потребители, тя може да означава много за разработчиците. Ако поддържате по-стара кодова база или току-що започвате с асинхронни задачи в Android, вероятно ще трябва да промените куп код. За щастие обаче Google не остави разработчиците на пух и прах.
Поради ограниченията на AsyncTask с течение на времето се появиха алтернативи, като RxJava и новата (ish) Coroutines библиотека на Kotlin. Тези алтернативи са склонни да имат много повече гъвкавост и функции от AsyncTask, така че са придобили доста голяма популярност. В своето известие за оттегляне за AsyncTask, Google препоръчва използването на Java Concurrency framework или Kotlin Coroutines.
Лично аз вече започнах да използвам Coroutines на Kotlin и не съм погледнал назад. Разбира се, знам, че много хора са интегрирали своя код плътно около AsyncTask, така че това вероятно е поне леко неудобство за тях. Хубаво е, че има много алтернативи за избор. Може да е досадно да промените кода си, но поне този път е възможно.
Ако искате повече подробности, можете да проверите ангажимента тук. Ангажиментът беше обединен по-рано днес и освен ако няма версия за поддръжка на Android в процес на подготовка, ще видим тази промяна отразена в Android 11 следващата година.