آموزش برنامه نویسی اندروید قسمت هجدهم
سلام مجدد خدمت دوستان. مقاری هستم و قسمت 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>
این هم نتیجه کار
خسته نباشید
نظرات کاربران