همه چیز راجع به سرویس ها در اندروید (۱_۲)

 (نکات تکمیلی ، ANR ، Crash ، Service و Thread)
سطح:پیشرفته

تفاوت ANR و Crash چیست؟
ANR : ANR مخفف Android Not Responding است . همانطور که میدانید تمامی پردازش های رابط کاربری و ظاهر و UI یک اپلیکیشن در Thread (نخ) اصلی و واحد آن انجام می شود. ANR زمانی رخ می دهد که ما یک پردازش طولانی مدت (چیزی حدود ۵ ثانیه)  را در ترد  اصلی UI انجام دهیم.
که این باعث می شود تا (GUI(Graphic User Interface برنامه قفل شود و دیگر هیچ واکنشی نشان ندهد. در این صورت یک دیالوگ ظاهر می شود که از شما میخواهد یا Wait را انتخاب کنید تا شاید برنامه بتواند خودش را بازیابی کند و مجددا اجرا شود و یا Force Close را انتخاب کنید تا از برنامه خارج شود.

Crash :Crash که در لغت به معنای درهم شکستن است ناشی از یک Exception و یک error مدیریت نشده است .(منظور از مدیریت نشده این است که درون try/catch نباشد )  مثل وقتی که در برنامه یک عدد را بر صفر تقسیم کنیم یا محاسبات ریاضی بین یک رشته از حروف و یک عدد انجام دهیم یا وقتی یک آرایه ی خالی را پیمایش کنیم و…  که منجر به Crash و در نهایت Force Close برنامه می شود و معمولا از روی نوع Exception میتوان به علت خطا پی برد.

اکنون میخواهیم کاری کنیم تا در سرویس مان پروسه ای طولانی انجام شود تا منجر به خطای ANR شود .
در صفحه ی activity_main.xml همانطور که در آموزش قبل گفتیم  دو دکمه برای شروع و توقف سرویس داریم و در MainActivity.java هم دستورات StartService و StopService را برای آنها می نویسیم.
در سرویس مان برای ایجاد خطای ANR  ، هر دو ثانیه یک بار Thread.sleep را در یک حلقه ی for تا ۱۰۰ مرتبه صدا میزنیم و به ازای هر اجرای حلقه یک Log به صورت زیر  چاپ میکنیم:
<<تابع Thread.sleep عددی را بر حسب میلی ثانیه میگیرد و می توان گفت که یک پردازش را به همان میزان شبیه سازی میکند و این طبیعی است که اگر یک محاسبات و پردازش طولانی مدت در Thread اصلی داشته باشیم حافظه کم می آورد . شما همچنین می توانید for  را بردارید و یک Thread.sleep طولانی بنویسید (مثلا ۹ ثانیه) .>>

ادامه مطلب