آموزش برنامه نویسی اندروید قسمت هجدهم

1395/1/12 --- 2921

سلام مجدد خدمت دوستان. مقاری هستم و قسمت 18 اندروید رو باهم شروع میکنیم. در جلسه قبل مروری بر AsyncTask داشتیم و متدهای اصلی اون رو معرفی کردیم. در این جلسه به ادامه مبحث Thread ها میپردازیم و مثال کاربردی از AsyncTask رو میزنیم تامتوجه بشید. همونطور که گفتم بحث Thread جزو مباحث پیشرفته هست اما حداقل در اندروید از اونجایی که خیلی کاربرد داره باید زودتر بیان بشه و کاملا برای همه جا بیفته.

همانطور که گفتم در هر برنامه یک MainThread داریم. این ترد باید برای هر عملیاتی در View ها در دسترس باشه و اگر کاری بیش از 5ثانیه طول بکشه اپ شما استاپ شده و با ارور ANR مواجه می شوید (application not responding)

کاری که میخوام بکنم این هست که یک تصویر رو از یک URL دانلود کنم. و به کاربر پیامی نشان بدم که دانلود در حال اجراست. بعد از آن هم که دانلود شد در یک ImageView عکس به کاربر نشان داده شه.

خب پس اول باید نحوه نمایش Progress Dialog رو یاد بگیریم.

 1 ) آشنایی با Progress Dialog

زمانی که عملیات طولانی مدت درحال اجرا هست از جمله دانلود کردن، حتما دیدید که پیامی به کاربر نمایش داده می­شه و بطور مثال روش نوشته شده "Please Wait". کنارش هم یه دایره­ای در حال چرخش هست و یا زیرش میزان پیشرفت عملیات رو نوشته. به اینها ­Progress Dialog میگیم. اما چطور نمایش بدیم.

من یک دکمه داخل فایل لیوتم گذاشتم به اسم btnDownload. حالا میخوام موقعی که روی دکمه کلیک شد، یک پروگرس به کاربر نشون داده بشه مثلا برای 5 ثانیه.

پس یک پروگرس تعریف کرده و شروع به نمایشش میکنم:

آموزش برنامه نویسی اندروید قسمت هجدهم

کد رو توضیح میدم. اول یک نمونه از progressdialog گرفتم. کانستراکتور این کلاس ورودی میگیره. ورودی­هاش اولی از جنس Context هست که همین اوکتیویتی رو بهش میدم. دومی نشان دهنده تم هست که حتما دیدید گاها به رنگ سفید هست این دیالوگ و گاها مشکی. البته روی API های پایین این تم جواب نمیده. من خودم روی API14 هستم الان.

در متدهای پایینتر هم به این دیالوگ عنوان و متن دادم و در اخر نمایشش دادم.

اگر که نسخه API پایینی گذاشتید ورودی دوم رو اصلا پر نکنید و تنها ورودی اول ProgressDialog را بدهید.

آموزش برنامه نویسی اندروید قسمت هجدهم

حالا باید به این دیالوگ یک زمان بدهیم مثلا 5 ثانیه. برای اینکار نیاز داریم که در یک Thread وقفه ای ایجاد کنیم. و بعد از 5 ثانیه با متد dismiss این دیالوگ بسته می­شود.

آموزش برنامه نویسی اندروید قسمت هجدهم

به همین راحتی. خب بریم سراغ AsyncTask

2 ) دانلود یک عکس در  AsyncTask و نمایش آن در  ImageView.

یک ImageView به نام imgView روی لیوت قرار میدم. کافی هست همان متدهایی که جلسه قبل گفتم رو بسازیم. کدهاتونو پاک کنید و بالای کلاس (قبل از onCreate) پروگرس دیالوگ رو تعریف کنید. همچنین ImageView رو و سپس در onCreate مقدار اون رو میزنیم:

آموزش برنامه نویسی اندروید قسمت هجدهم

خب به این نام تعریفش میکنم:

آموزش برنامه نویسی اندروید قسمت هجدهم

یادتون هست که Generic بود و سه مقدار باید مشخص میکردیم. اولیش مقداری که doInBackground بعنوان ورودی میگیره. دومیش برای میزان پیشرفت کار بوده و سومی مقداری هست که بعنوان نتیجه قرار داده میشه.

خروجی کدی که میزنیم از نوع Bitmap هست که قبلا با اون آشنا شدید.

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

آموزش برنامه نویسی اندروید قسمت هجدهم

اگه یادتون باشه این متد عملیات قبل از شروع کارهای اصلی رو در بر داشت.

خب برای عملیات اصلی از متد doInBackground استفاده میکنیم. کد زیر برای دریافت Bitmap از یک url هست:

آموزش برنامه نویسی اندروید قسمت هجدهم

ورودی از متد varangs بود یعنی میشد هرتعداد میخواهیم از این نوع ورودی به آن پاس بدهیم. پس همانطور که میبینید در کد برای اینکه مشخص کنم اولین مقدار این ورودی را میخواهم (هرچند ما تنها یک ورودی پاس میدهیم) مثل آرایه با آن برخورد کردم و گفتم args[0]. کلاس BitmapFactory متدی به نام decodeStream دارد که خروجیش از نوع Bitmap هست. این متد ورودی InputStream میگیرد پس باید مقدار ورودی متد doInBackground را بخوانیم. ابتدا بعنوان Url آن را تعریف کرده و سپس به InputStream آن را Cast کنیم. خب کد اصلی ما تموم شد!

در نهایت این bitmap خوانده شده را برمیگردانم. یادتون هست که گفتم خروجی این متد به متده onPostExecute برمیگردد. کافی هست در این متد این Bitmap را بک گراند کنیم و از طرفی دیالوگ را تمام کنیم.

آموزش برنامه نویسی اندروید قسمت هجدهم

حالا برای صدا زدن این متد در oneClick این AsyncTask را فراخوانی می کنیم 

@Override
public void onClick(View view) {
   DownloadImage downloadImage =  new DownloadImage();
    downloadImage.execute("http://www.3d-hdwallpaper.com/bulk_images/desktop-hd-apple-fruits-logo-pictures.jpg");
}

و البته قرار دادن اجازه دسترسی به اینترنت در فایل manifest فراموش نشود:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

این هم نتیجه کار 

آموزش برنامه نویسی اندروید قسمت هجدهم

خسته نباشید