توفي AsyncTask في Android 11: 3 بدائل وأخطاء نموذجية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

هل مات AsyncTask؟ تحيا الكوروتينات! دليل كامل للترحيل إلى Kotlin



إذا كنت قد فتحت Android Studio في العامين الماضيين، فمن المحتمل أنك رأيت هذا التحذير المحزن: AsyncTask is deprecated. نعم، ذلك المساعد الأمين للمهام الخلفية الذي أنقذنا منذ Android 1.5، أصبح رسميًا مهملاً بدءًا من Android 11 (API 30).



لكن لا داعي للذعر! لم تقم Google "بقتل" AsyncTask من دون سبب. كان مليئًا بالأخطاء الخفية، وتسربات الذاكرة، ومشاكل دورة الحياة. في هذه المقالة، سنستعرض أهم الأخطاء عند الترحيل من AsyncTask ونوضح الأدوات الحديثة التي حلت محله. ستتعلم كيفية كتابة كود نظيف وآمن وفعال بلغة Kotlin دون صداع.



لماذا أصبح AsyncTask مشكلة؟ (شرح موجز)

قبل البحث عن بدائل، دعنا نتذكر كيف كان AsyncTask "يسعدنا":

  • تسرب الذاكرة: إذا تم تدمير Activity (تدوير الشاشة) بينما لا يزال AsyncTask قيد التنفيذ، فإنه يحتفظ بمرجع إلى Activity القديم، مما يمنع جامع القمامة (GC) من جمعه.
  • صعوبة مع دورة الحياة: تنفيذ المهمة غير مرتبط بدورة حياة المكون. قد تصل النتيجة إلى Activity تم تدميره بالفعل.
  • التنفيذ التسلسلي: في Android 3.0+، يتم تنفيذ AsyncTask افتراضيًا بشكل تسلسلي في خيط واحد، مما يقتل فكرة التوازي.
  • غياب الإلغاء الفعال: طريقة cancel() لا تعمل بشكل صحيح وغالبًا لا توقف الخيط.


الآن بعد أن تذكرنا هذه الآلام، دعنا ننتقل إلى الحلول الحديثة التي تقدمها Kotlin و Android Jetpack.



أفضل 3 بدائل لـ AsyncTask في Android 11+ (Kotlin)



بدلاً من إعادة اختراع العجلة، نستخدم أدوات مجربة. إليك أفضل بدائل AsyncTask التي يجب أن تعرفها:



1. Kotlin Coroutines (الكوروتينات) — القاتل الرئيسي لـ AsyncTask

هذه هي الطريقة الأكثر حداثة والتي توصي بها Google. الكوروتينات خفيفة الوزن، وآمنة، وتتكامل بشكل مثالي مع Jetpack (ViewModel، LiveData، Room).



مثال: تحميل بيانات من الشبكة (بديل AsyncTask)

بدلاً من كتابة:

// AsyncTask القديم (لا تفعل هذا)class MyAsyncTask : AsyncTask<String, Void, String>() {    override fun doInBackground(vararg params: String?): String {        // عملية طويلة        Thread.sleep(3000)        return "Result"    }    override fun onPostExecute(result: String?) {        textView.text = result    }}

الآن نستخدم الكوروتينات:

// النهج الجديد باستخدام Kotlin Coroutinesclass MyViewModel : ViewModel() {    private val _result = MutableLiveData<String>()    val result: LiveData<String> = _result

fun fetchData() { viewModelScope.launch { // التنفيذ في الخلفية val data = withContext(Dispatchers.IO) { // محاكاة عملية طويلة delay(3000) "Result from Coroutine" } // العودة تلقائيًا إلى الخيط الرئيسي _result.value = data } }}


لماذا هذا رائع؟ viewModelScope يلغي الكوروتين تلقائيًا عند تدمير ViewModel. لا تسرب للذاكرة! و withContext(Dispatchers.IO) يبدل سياق التنفيذ. الكود يُقرأ كما لو كان متزامنًا، لكنه يعمل بشكل غير متزامن.



2. RxJava / RxKotlin — النهج التفاعلي

إذا كنت تحب تدفقات البيانات والعوامل (Operators)، فإن RxJava لا يزال أداة قوية. ومع ذلك، للمهام البسيطة، قد يكون مبالغًا فيه. استخدمه إذا كان المشروع يحتوي بالفعل على Rx.



مثال: Single بدلاً من AsyncTask

// بديل AsyncTask باستخدام RxJavaclass DataRepository {    fun fetchData(): Single<String> {        return Single.fromCallable {            // عمل في الخلفية                

المدونات

توصيات الكتب