کلاس AsyncTask به شما اجازه می دهد تا دستوراتی را در پس زمینه به اجرا بگذارید و سپس آن ها را با thread اصلی همگام نموده و همچنین گزارشاتی مربوط به تسک های در حال اجرا به thread اصلی تحویل دهید. لازم به ذکر است که از کلاس AsyncTasks اغلب برای اجرای عملیات در پس زمینه که UI را بروز رسانی می کنند، استفاده می شود.
در واقع کلاس AsyncTask یک کلاس انتزاعی و abstract است که به برنامه های اندرویدی امکان می دهد تا thread اصلی (UI) را به صورت بهینه مدیریت نمایید. AsyncTask به توسعه دهنده کمک می کند تا تسک هایی که چند ثانیه بیشتر طول نمی کشند را در پس زمینه به طور ناهمزمان اجرا نموده و نتیجه ی آن را در thread اصلی نمایش دهد.
استفاده ی کاربردی از کلاس AsyncTask
برای استفاده از کلاس AsyncTask لازم است از آن یک کلاس فرزند ایجاد نمایید ( از AsyncTask یک کلاس مشتق نمایید). کلاس AsyncTask از generic و varargs استفاده می کند. پارامترهای ورودی عبارتند از :
<AsyncTask <TypeOfVarArgParams, ProgressValue, ResultValue
کلاس AsyncTask با صدا خوردن متد () execute راه اندازی می شود. متد () execute خود به تبع متدهای doInBackground() و onPostExecute() را فراخوانی می کند
TypeOfVarArgParams به عنوان آرگومان ورودی به تابع () doInBackground فرستاده می شود.
ProgressValue ویژه ی اطلاعات پیشرفت فرایند بکار برده می شود و ResultValue باید به عنوان خروجی از متد ()doInBackground بازگردانی شود. این آرگومان خود به عنوان پارامتر ورودی به تابع () onPostExecute پاس داده می شود.
متد () doInBackground دربردارنده ی دستورات و کدهایی است که می بایست در یک thread مجزا در پس زمینه اجرا شوند.
متد () onPostExecute خود را با Thread اصلی (UI) همگام ساخته و بروز رسانی اطلاعات آن را به دنبال دارد. زمانی که عملیات متد () doInBackground به پایان می رسد، خود چارچوب نرم افزاری اندروید ( )FRAMEWORK این متد را فراخوانی می کند.
اجرای همزمان چندین AsyncTasks
سیستم اندروید قبل از ویرایش ۱٫۶ و بار دیگر از ورژن ۳٫۰ ، تسک های مربوط به AsyncTask را به صورت پیش فرض به ترتیب (و پشت سرهم) اجرا می نماید. شما می توانید به سیستم اندروید اعلان نمایید که این تسک ها را به طور موازی با اجرای متد () ،executeOnExecutor در حالی که AsyncTask.THREAD_POOL_EXECUTORبه عنوان اولین پارامتر به آن ارسال شده، اجرا نماید.
تکه کد زیر این عملیات را نمایش می گذارد.
// ImageLoader extends AsyncTask ImageLoader imageLoader = new ImageLoader( imageView ); // Execute in parallel imageLoader.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, "http://url.com/image.png" );
نکته: AsyncTask تغییرات در نحوه ی پیکربندی و تنظیمات را به صورت خودکار مدیریت نمی کند، بدین معنی که چنانچه activity از نو ساخته شود، برنامه نویس باید آن را با نوشتن کد مربوطه مدیریت نماید. یک راه حل پرطرفدار و مورد استفاده ی اغلب توسعه دهندگان این است که کلاس AsyncTask را در یک fragment ) retained headless fragment که اطلاعات خود UI های فاقد را بین تغییرات در نحوه ی پیکربندی حفظ می کنند) تعریف نمایید.
مثال: پیاده سازی AsyncTask
کد زیر چگونگی استفاده از کلاس AsyncTask جهت دانلود محتوای یک صفحه ی وب را به نمایش می گذارد.
یک پروژه ی جدید اندروید به نام de.vogella.android.asynctask و یک activity به نام ReadWebpageAsyncTask ایجاد نمایید. مجوز android.permission.INTERNET را در فایل تنظیمات اپلیکیشن (manifest) تنظیم نمایید.
Layout زیر را ایجاد نمایید.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/readWebpage" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="Load Webpage" > </Button> <TextView android:id="@+id/TextView01" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Placeholder" > </TextView> </LinearLayout>
بدنه ی activity خود را به صورت زیر ویرایش نمایید.
package de.vogella.android.asynctask; // imports cut out for brevity public class ReadWebpageAsyncTask extends Activity { private TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.TextView01); } private class DownloadWebPageTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { // we use the OkHttp library from https://github.com/square/okhttp OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(urls[0]) .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } } return "Download failed"; } @Override protected void onPostExecute(String result) { textView.setText(result); } } public void onClick(View view) { DownloadWebPageTask task = new DownloadWebPageTask(); task.execute(new String[] { "http://www.vogella.com/index.html" }); } }
اپلیکیشن خود را اجرا نموده و دکمه ی مربوطه را کلیک نمایید. اطلاعات صفحه وب مورد نظر در پس زمینه خوانده می شود. به مجرد اتمام این فرایند، می بینید که آبجکت TextViewبا اطلاعات جدید بروز آوری می شود.
امیدواریم آموزش کلاس AsyncTask در اندروید نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پستها بیشتر ، ما را در مدرسه کدنویسی تلگرام و یا در تی جوان اینستاگرام دنبال کنید.