AsyncTask در اندروید چیست؟

ترد اصلی UI اندروید

اندروید رخدادهای ورودی یا تسک‌ها را در یک تک ترد (Thread) رابط کاربری (UI) مدیریت می‌کند که به این ترد، ترد اصلی (Main Thread) گفته می‌شود. ترد اصلی نمی‌تواند چند عملیات همزمان را مدیریت کند و فقط یک رخداد را در هر لحظه پردازش می‌کند.

پردازش همزمان در اندروید

اگر رخدادها ورودی یا تسک‌ها به صورت همزمان اجرا نمی‌شوند تمام کدهای یک اپلیکیشن اندروید روی ترد اصلی خواهد بود و هر خط کد یکی پس از دیگری اجرا خواهد شد. فرض کنید شما یک عملیات طولانی مدت را انجام می‌دهید، برای مثال دسترسی پیدا کردن به منابعی از طریق اینترنت (مثل عکس، MP3 یا JSON). در این‌صورت تا هنگامی که عملیات مورد نظر انجام نشود اپلیکیشن از کار خواهد افتاد.
برای داشتن یک تجربه کاربری خوب در اپلیکیشن‌های اندروید، تمام تسک‌ها یا عملیاتی که بالقوه کند هستند باید به صورت ناهمگام(asynchronous) اجرا شوند.

چند مثال از تسک‌های زمان‌بر:

  1. دسترسی به منابع از طریق اینترنت
  2. عملیات روی دیتابیس
  3. فراخوانی‌های وب‌سرویس
  4. منطق پیچیده که زمان زیادی برای اجرا می‌خواهد
  • AsyncTask در اندروید

AsyncTask چیست؟

AsyncTask یک کلاس انتزاعی اندروید است که به اپلیکیشن‌های اندروید کمک می‌کند تا ترد اصلی UI را به صورت مؤثر مدیریت کنند. کلاس AsyncTask به ما امکان می‌دهد تا تسک‌های زمان‌بر را اجرا کرده و حاصل را روی ترد اصلی بدون تأثیر گذاشتن روی آن نمایش دهیم.

چه‌موقع از AsyncTask استفاده کنیم؟

فرض کنیم شما یک اپلیکیشن ساده ساخته‌اید که یک فایل MP3 را هنگام اجرای برنامه از اینترنت دانلود می‌کند. نمودار وضعیت زیر مجموعه عملیاتی را نشان می‌دهد که وقتی اپلیکیشنتان را اجرا می‌کنید اتفاق می‌افتند.

همچنان‌که دانلود فایل از سرور در حال انجام است، اپلیکیشن غیر قابل استفاده می‌شود تا زمانی که ترد اصلی منتظر اتمام عملیات دانلود است. برای مواجه با این‌گونه مشکلات می‌توانیم یک ترد جدید بسازیم و متد run آن را بگونه تغییر دهیم که این فراخوانی شبکه را اجرا کند دقیقاً شبیه کاری که معمولاً در برنامه‌های عادی جاوا انجام می‌دهیم. درنتیجه UI پاسخگو باقی می‌ماند.
به‌ این علت که toolkit رابط کاربری اندروید thread safe نیست، پیاده‌سازی این مسأله با چند ترد ممکن است خود مشکلات اضافی جدیدی را وقتی سعی کنیم UI را طبق نتایجی که از اجرای عملیات دانلود بدست می‌آید آپدیت کنیم، ایجاد کند.
اندروید تمام این مشکلات را درنظر داشته و کلاس اختصاصی‌ای را به نام «‌AsyncTask» ساخته تا تسک‌ها و عملیاتی را که نیاز است در پس‌زمینه به صورت ناهمگام اجرا شوند، مدیریت کند.

نکته : AsyncTask فقط باید برای تسک‌های استفاده شود که تنها چند ثانیه طول می‌کشند، بعضی تسک‌ها ممکن است ترد را برای مدت زیادی در حال اجرا نگه‌دارند در این صورت این تسک‌ها باید به‌وسیله پکیج «java.util.concurrent» مدیریت شوند.

چگونه AsyncTask پیاده‌سازی می‌شود؟

1 داخل یک کلاس Activity یک زیرکلاس بسازید و آن را از کلاس AsyncTask مشتق کنید همانگونه که در زیر نشان داده شده:


 

2 بسادگی تسک را با فراخوانی متد execute اجرا کنید:


 

چهار مرحله AsyncTask

وقتی یک تسک ناهمگام از ترد اصلی UI اجرا می‌شود از چهار مرحله می‌گذرد:

  • onPreExecute :

قبل از اجرای تسک فراخوانی می‌شود، در تئوری قبل از اینکه متد «doInBackground» روی تردUI فراخوانی شود. این متد اغلب برای آماده‌سازی اجرای تسک استفاده می‌شود (مثل نمایش نوار پیشرفت در رابط کاربری)

  • doInBackground:

کدهایی که اجرای آن‌ها زمان‌بر است باید در این متد نوشته شوند. وقتی متد execute در ترد اصلی UI فراخوانی شد این متد با پارامترهایی که به آن ارسال شده اجرا می‌شود.

  • onProgressUpdate:

متدdoInBackground در هرلحظه با فرخوانی «publishProgress» این متد را اجرا می‌کند. این متد می‌تواند برای نمایش پیشرفت کار به هر صورت، در رابط کاربر استفاده شود.

  • onPostExecute:

وقتی پردازش محاسبات پس‌زمینه در متد «doInBackground» پایان یافت فراخوانی می‌شود. نتایج «doInBackground» به این متد فرستاده می‌شوند.

  • کنسل کردن تسک

تسک می‌تواند با فراخوانی متد cancel(boolean) کنسل شود. اجرای این متد باعث فراخوانی‌های بعدی isCancelled() خواهد شد تا پاسخش true شود. بعد از اجرای این متد به جای متد onPostExecute() متد onCancelled(Object) فراخوانی می‌گردد.

AsyncTask – قوانینی که باید دنبال شوند

  1. کلاس AsyncTask باید در ترد UI بارگذاری شود.
  2. نمونه تسک باید در ترد UI ساخته شود.
  3. متد «execute(Params…)» باید در ترد UI فراخوانی شود.
  4. متدهای onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) نباید به صورت دستی فراخوانی شوند.
  5. هر تسک فقط می‌تواند یک بار اجرا شود(اگر تلاش برای اجرای دوباره یک تسک صورت گیرد یک exception ارسال خواهد شد)


اصل این مقاله توسط در androidpolice.com منتشر و توسط امین محمودیان به فارسی ترجمه شده است.
مهندس نرم‌افزار، توسعه‌دهنده اندروید، عضو جامعه نرم افزار آزاد و یک نامترجم

5 دیدگاه برای “AsyncTask در اندروید چیست؟”

  1. داداش ادامه نمیدی؟
    داره پدرمون درمیاد انقد خارجی میخونیم تو سایتاشون اگه همه رو اینجوری ترجمه کنید سایت محشری میشه!

  2. خیلی ممنون از مطلب مفیدتون
    ی سوال داشتم اینکه برای خوندن جی پی اس هم باید از asynctask استفاده بشه؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *