آموزش برنامه نویسی موازی در اندروید
سلام،
تو این پست قصد داریم نحوه برنامه نویسی موازی تو اندروید رو به شما آموزش بدیم.
اینکه یه ترد واسه کارای اصلی و ظاهر برنامه مون داشته باشیم و بقیه کارامون رو بسپاریم به تردهای دیگه.
فک کنم مناسبترین کتابخونه واسه این کار تو اندروید کتابخونه ی asynctask باشه..
اما به نظرتون چه کاری هست که ربطی به ظاهر(ui) برنامه نداره ولی نیاز هست که انجام بشه؟
بله، مثلن کار با وب سرویس ها و ارسال و دریافت اطلاعات..
اما چرا اصرار داریم که بگیم کارایی که به ui وابسته نیستن رو باید تو یه ترد دیگه انجام بدیم؟
اولا: یه سری کارا زمانبره و بهتره که بطور موازی اجرا بشن تا جلوی کارای سبکی که میشه با برنامه انجام داد رو نگیریم! (هشدار» اگه کارای طولانی تو ترد اصلی اجرا بشن حتی ممکنه در بعضی مواقع با خطا هم رویرو شیم!)
دوما: از یه دید دیگه که بخوایم به سوال نگاه کنیم و جوابشو بدیم اینه که شما از تردهای دیگه نمیتونید به ui دسترسی داشته باشید! پس اگه تردتون به ui ربط داره باید تو همون ترد اصلی انجام بگیره!
ولی تا میتونید کارای مستقل از ui رو تو تردهای فرعی انجام بدید تا برنامه ی بهینه تری داشته باشید
در ادامه قصد داریم وارد کد و بخش عملی کار شیم:
اول از همه تو بخش layout (ظاهر برنامه) یه button و یه textview قرار بدید..
قراره با فشردن دکمه، متن داخل textview در هر چند ثانیه تغییر پیدا کنه و ظاهر شه...
اول از همه دو متد مهم واسه این کار رو معرفی میکنیم:
private class textViewChanger extends AsyncTask< /*params*/string,
/* progress*/Integer, /*Result*/string>{
@Override
protected String doInBackground(String... args) { return null; } }
متد doInBackground برای دریافت پارامترها به کار میره و کار اصلی و انجام میده.
@Override protected void onPostExecute(String s) {
}
متد onPostExecute برای استفاده از نتایج عملیاتی که در doInBackground انجام گرفته، به کار میره. اینجا دیگه شما میتونید با ظاهر برنامه هم در ارتباط باشید(بر خلاف doInBackground که اگه داخلش کدای مربوط به ui رو بنویسید با خطا مواجه میشید.)
اما خب همونطور که از اسم onPostExecute پیداست این متد فقط زمانی که به اتمام برسه اجرا میشه! بنابراین یه متد نیاز داریم که حین کارمون بتونیم مدام ازش استفاده کنیم و متن رو تغییر بدیم.. همچنین برای این منظور(اعمال تغییرات بصری حین انجام عملیات درون onPostExecute از یه متد دیگه هم باید استفاده کنیم به اسم onProgressUpdate . اما ببینیم کدمون چه شکلی میشه با این دو تا تابع:
protected void updateText(String inpText){
TextView tv1 = (TextView) findViewById(R.id.textView); tv1.setText(inpText);
}
private class TxtTimer extends AsyncTask< String, Integer, String>{
@Override protected String doInBackground(String... strings) { for (int i =0; i <= 10;i++){ publishProgress(i,10); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { updateText("progress: "+values[0]+"/"+values[1]); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } }
تابع publishProgress برای اعلان مقدار پیشرفت کار، بکار میره و خبرشو به onProgressUpdate میرسونه.. همونطور که میبینید دو تا ورودی هم بهش دادیم که اولی مقدار پیشرفت و دومی کل کاری که باید انجام بشه رو نشون میده.. بنابراین با این دوتا میتونیم درصد پیشرفت رو نشون بدیم! موقع استفاده از اونها تو متد onProgressUpdate با نامهای [values[0 و [values[1 قابل دسترسی هستند
همچنین تابع sleep برای ایجاد وقفه بکار میره که خودمون محض آموزش اینجا قرار دادیم!
شاد باشید :)