آموزش AsyncTask در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش AsyncTask در برنامه نویسی اندروید می پردازیم با استفاده از Async Task به شما قابلیتی می دهد تا کار های بسیار سنگین را در background انجام دهید و بخش Ui را بدون اینکه قفل شود یعنی بدون گیر کردن قابل استفاده خواهد بود برنامه به طور معمول در single Thread اجرا می شود و در صورتی که برنمامه اعمال background سنگین داشته باشد ممکن از Ui ما حالت Responsive خود را از دست بدهد و همش منتظر عملیات Background باشد برای اینکه از این کار جلوگیری کنیم از AsyncTask استفاده می کنیم.
چهار متود در کلاس asyncTask وجود دارد
doInBackground() تمامی عملیات های background در این متود قرار می گیرد و هر زمانی که بخواهیم result خود را به Ui می فرستیم.
onPreExecute() قبل از اینکه عملیات background ما اجرا شود این متود اجرا شده است.
onPostExecute() بعد از اینکه متود doInBackground ما به اتمام رسید بلافاصله یک نتیجه به این متود ارسال می شود.
onProgressUpdate() این متود مقدار پیشرفت عملیات را update می کند و مقدار آن update را به UI Thread می برد تا در آن جا نیز تغییراتی اعمال شود. شاید با یک مثال بهتر متوجه شوید اگر ما یک progressbar داشته باشیم و بخواهیم همزمان با انجام عملیات مقدار آن نیز تغییر کند (update شود ) و مقدار آن در Ui نیر تغییر کند.
یک فایل به نام activity_main.xml ایجاد کنید و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="10pt" android:textColor="#444444" android:layout_alignParentLeft="true" android:layout_marginRight="9dip" android:layout_marginTop="20dip" android:layout_marginLeft="10dip" android:text="Sleep time in Seconds:"/> <EditText android:id="@+id/in_time" android:layout_width="150dip" android:layout_height="wrap_content" android:background="@android:drawable/editbox_background" android:layout_toRightOf="@id/tv_time" android:layout_alignTop="@id/tv_time" android:inputType="number" /> <Button android:id="@+id/btn_run" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Run Async task" android:layout_below="@+id/in_time" android:layout_centerHorizontal="true" android:layout_marginTop="64dp" /> <TextView android:id="@+id/tv_result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="7pt" android:layout_below="@+id/btn_run" android:layout_centerHorizontal="true" /> </RelativeLayout> |
شامل یک TextView برای نمایش پیام و یک EditText برای دریافت یک ورودی یک دکمه برای انجام کار و یک TextView دیگر برای نمایش result
حالا یک فایل به نام MainActivity.java ایجاد کرده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | package ir.programchi; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button button; private EditText time; private TextView finalResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); time = (EditText) findViewById(R.id.in_time); button = (Button) findViewById(R.id.btn_run); finalResult = (TextView) findViewById(R.id.tv_result); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AsyncTaskRunner runner = new AsyncTaskRunner(); String sleepTime = time.getText().toString(); runner.execute(sleepTime); } }); } private class AsyncTaskRunner extends AsyncTask<String, String, String> { private String resp; ProgressDialog progressDialog; @Override protected String doInBackground(String... params) { publishProgress("Sleeping..."); try { int time = Integer.parseInt(params[0])*1000; Thread.sleep(time); resp = "Slept for " + params[0] + " seconds"; } catch (InterruptedException e) { e.printStackTrace(); resp = e.getMessage(); } catch (Exception e) { e.printStackTrace(); resp = e.getMessage(); } return resp; } @Override protected void onPostExecute(String result) { progressDialog.dismiss(); finalResult.setText(result); } @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(MainActivity.this, "ProgressDialog", "Wait for "+time.getText().toString()+ " seconds"); } @Override protected void onProgressUpdate(String... text) { finalResult.setText(text[0]); } } } |
ابتدا یک کلاس به نام AsyncTaskRunner ایجاد کردیم و به AsyncTask گسترشش دادیم برای اینکه بتوانیم از asynctask استفاده کنیم سپس view های مربوط به هر object را به دست آوردیم ما برای اینکه به شما مقدار آپدیت را نمایش بدهیم از progressbar استفاده کردیم قبل این کد هم بقیه void ها را توضیح دادیم.
در ادامه می توانید پیش نمایشی از کد بالا را ببینید.
این آموزش به پایان رسید.
موفق و موید باشید.
بسیار عالییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییییی
🙂
خدا قوت
خواهش می کنم
موفق باشید.
حرف نداره اموزش هاتون
تنها سایت ایرانی که اینقدر خوب اموزش میزاره شما هستید
خیلی تشکر …
خیلی ممنون نظر لطف شماست.
چقدر کاربردیه واقعا ممنون
خواهش می کنم موفق باشید.
ممنون مثل همیشه عالی 🙂
یک سوال : کارهایی که ما با اسینتسک میکنیم مگر نمیشه با ترد و هندلر برای ارتباط با رابط گرافیکی انجام داد؟ مزیت اسینتسک چیه؟؟
راستی پیش نمایش اخر مطلب هم انگاری حذف شده
راستی خدا قوت برادر مثل همیشه آموزشاتون عالیه 🙂
سلام خیر امکان نداره ترد و هندلر و postdealy هر کدام یک کار اختصاصی دارند شما اگر بخواید کنترل بیشتری بروی نتیجه ها یا response هایی که از سرور بر میگردن داشته باشید لازم است از AsyncTask استفاده کنید مثلا ورودی سرور شما چند تا عدده برای مثال بعدم خروجی شما میشه جمع عددهای ورودی برای گرفتن نتیجه میشه از AsyncTask از بخش Result ش استفاده کرد ولی کلی کارایی دیگه هم دارد.
سلام ممنون از اموزش خوبتون
من دارم روی پروژه ی اندرویدی کار میکنم که در اون لازمه سرور اطلاعاتی رو بفرسته..(مثل نوتیفیکیشن هایی که در صورت دریافت پیام از شخصی در یک شبکه اجتماعی میاد)
میخواستم بپرسم واسه اینکه حتی زمانی که داخل برنامه نیستیم بتونیم این اطلاعات رو دریافت کنیم باید از asynctask استفاده کنیم؟
یا receiver ها؟
ممنون میشم راهنمایی کنید
سلام از هیچکدام باید از سرویس Gcm گوگل استفاده کنید یا یک سرویس شبیه به آن را خودتان بنویسید.
موفق باشید.
سلام آقای جعفری پور، خدا قوت
چند سوال داشتم:
آیا میشه از Async Task در متدهایی که بسیار صدا زده میشند، استفاده کرد مثل:OnDraw؟
و آیا میشه ورودی متد executer و یا خروجی متدهای داخل کلاس AyncTask رو تغییر داد و بنا به تنوع موقعیت از اونها استفاده کرد؟ مثلا میشه در متد onDraw از اون استفاده کرد و ورودیش رو مثلا Canvas در نظر گرفت؟
و آیا حتما باید در AsyncTask خروجی رو گرفت؟