هفت اشتباه رایج در برنامه نویسی اندروید
هر توسعه دهنده ی اندرویدی در توسعه ی اپلیکیشن های خود ممکن است دچار اشتباهاتی شود، در این مقاله مواردی را بررسی میکنیم که با رعایت آنها میتوانید اپلیکیشن های اندروید خود را بهبود ببخشید. برای مثال بسیاری از توسعه دهندگان از Intent ها استفاده نمیکنند یا برای مثال اطلاعات کافی و مناسب در رابطه با Bitmap ندارند. از لایه بندی های تودرتو در اپلیکیشن خود استفاده میکنند یا به هیچ وجه از Fragment استفاده نمیکنند. در این مقاله به روش هایی برای بهینه سازی اپلیکیشن های اندرویدی میپردازیم.
۱. توسعه در یک دستگاه اندروید
بسیاری از توسعه دهندگان اپلیکیشن اندرویدی خود را تنها بر روی تلفن همراه خود توسعه میدهند و تمامی طراحی هایی که انجام میدهند تنها در دستگاه تلفن همراه خودشان به خوبی نمایش داده میشود. این نکته در دنیای اپلیکیشن نویسی اندروید بسیار مهم است که به تمامی دستگاه ها با ابعاد های مختلف توجه کنید. برای مثال ممکن است اپلیکیشن شما در تبلت نمای بسیار بدی پیدا کند. برای تست این کار تنها لازم است از Genymotion استفاده کنید و اپلیکیشن خود را در تمامی ابعاد به راحتی تست کنید.
۲. عدم استفاده از Intent
Intent ها نقش بسیار مهمی در توسعه اپلیکیشن های اندرویدی دارند. فرض کنید یک اپلیکیشن گالری دارید که میتواند لینک دانلود عکس ها را از طریق پیامک به اشتراک بگذارد. برای پیاده سازی این پروژه ۲ راه حل وجود دارد.
راه حل اول : ابتدا مجوز SEND_SMS را در manifest مشخص کنیم و سپس با استفاده از SmsManager پیامک را ارسال کنیم و به کاربران خود توضیح دهیم که چرا اپلیکیشن نیاز به دسترسی به پیامک ها را دارد و طبیعتا ممکن است با واکنش منفی کاربران روبرو شود.
راه حل دوم : یک Intent برای SMS بنویسید و به راحتی پیامک خود را ارسال کنید.
Intent sendIntent = new Intent(Intent.ACTION_VIEW); sendIntent.setData(Uri.parse("sms:" + telephoneNumber)); sendIntent.putExtra("sms_body", x); startActivity(sendIntent);
بدون شک دومین راه حل بهترین راه حل است. با این روش میتوانید کارهای بسیاری انجام دهید، برای مثال اطلاعات را به اشتراک بگذارید، عکس بگیرید، ویدیو ذخیره کنید و به مخاطبین دسترسی پیدا کنید.
۳. عدم استفاده از Fragment
مدتی پیش هنگام عرضه نسخه Honeycomb اندروید، گوگل مفهوم جدیدی به نام Fragment را معرفی کرد. Fragment ساختار مخصوص به خودش را دارد و همچنین دارای LifeCycle اختصاصی می باشد که درون Activity میتواند تعریف شود. با استفاده از Fragment میتوانید اپلیکیشن خود را برای بسیاری از صفحات بهینه کنید.
ساختن یک Activity برای هر صفحه از اپلیکیشن روش غیر استانداردی برای توسعه اپلیکیشن می باشد و همچنین سیستم عامل تلاش میکند تا زمانی که میتواند Activity شما را در حافظه خود قرار دارد. در هر جایی از اپلیکیشن که امکان استفاده از Fragment وجود دارد باید از Fragment استفاده کرد.
۴. متوقف شدن Main Thread
Main Thread در اپلیکیشن های اندرویدی برای اجرای فرآیند های اپلیکیشن استفاده میشود. هنگامی که Main Thread شما متوقف شود اپلیکیشن شما از کار خواهد افتاد و کاربر توانایی استفاده از اپلیکیشن را نخواهد داشت و این باعث واکنش منفی از سوی کاربران میشود. هنگامی که Main Thread متوقف میشود (۵ ثانیه برای اکتیوتی و ۱۰ ثانیه برای Broadcast Receiver) اصطلاحا ANR رخ میدهد.
این اتفاق در اندروید ۲ بسیار رایج بود به دلیل اینکه سیستم عامل به شما اجازه نمیداد که در Main Thread درخواست دسترسی به شبکه را بدهید و اطلاعات را دریافت و ارسال کنید.
برای اینکه از متوقف شدن Main Thread جلوگیری کنید از Thread هایی در بک گراند اپلیکیشن خود استفاده کنید. برای مثال برای موارد ذکر شده حتما از Thread های جداگانه استفاده کنید : ۱. دسترسی به اینترنت ۲. بارگزاری Bitmap و تصاویر ۳. پردازش تصویر ۴. دسترسی به دیتابیس ۵. خواندن و نوشتن بر روی SD Card
۵. چرخ را دوباره اختراع نکنید
چرخ را دوباره اختراع نکنید، بسیاری از اپلیکیشن های اندرویدی نیاز به دسترسی به اینترنت، بارگزاری تصاویر، دسترسی به دیتابیس محلی، پارس کردن Json و صفحات ورود و ثبت نام دارند، نه تنها شما بلکه تمامی توسعه دهندگان نیاز به همچین امکاناتی در برنامه ی خود هستند، بنابراین بهتر است از کتابخانه هایی که دیگر توسعه دهندگان نوشته اند در اپلیکیشن خود استفاده کنید.
۱. به عنوان build system اپلیکیشن خود از gradle استفاده کنید.
۲. برای دسترسی به اینترنت از Volley یا HttpOK استفاده کنید.
۳. برای بارگزاری تصاویر از Picaso استفاده کنید.
۴. برای پارس کردن Json از Gson یا Jackson استفاده کنید.
و …
اگر نیاز به پیاده سازی یک ماژول دارید، ابتدا به اندازه ی کافی جست و جو کنید تا منابع کافی به دست آورید.
۶. عدم درک Bitmap
کاربر ها به محتوا علاقه ی بسیاری دارند خصوصا هنگامی که محتوا برای آنها جذاب باشد. برای مثال عکس ها نمونه ی بارزی از یک محتوای جذاب هستند. درون یک عکس میتوان به اندازه ی هزاران خط نوشته مفهوم گنجاند اما یک مشکل اساسی مطرح است و آن مقدار حافظه ایست که عکس ها اشغال میکنند.
قبل از اینکه تصاویر بر روی صفحه ی نمایش کاربر نمایش داده شوند باید در حافظه بارگزاری شوند، به دلیل اینکه bitmap بهترین راه حل برای نمایش عکس در تلفن های اندرویدی می باشد میخواهیم در رابطه با bitmap اطلاعات بیشتری کسب کنیم.
فرض کنید میخواهید یک عکس را در تلفن همراه نمایش دهید که توسط Camera گرفته شده است، مقدار حافظه ای که مصرف میشود به صورت زیر محاسبه میشود :
مقدار حافظه ی لازم (بر حسب بایت) = ۴ * عرض تصویر * ارتفاع تصویر
شاید برای شما سوال شود که چرا عدد ۴ در ابتدای فرمول قرار دارد، بسیار واضح است، کانفیگ bitmap به صورت ARGB_8888 می باشد. یعنی برای هر پیکسلی که در تصویر نمایش داده میشود ۸ بیت (۱ بایت) برای نگه داشتن مقادیر آلفا، قرمز، سبز و آبی از حافظه اشغال میشود تا تصویر نمایش داده شود. کانفیگ های دیگری مثل RGB_565 وجود دارد که نصف ARGB_8888 حافظه مصرف میکند اما خاصیت Transparency یا شفافیت در تصویر کم میشود و حتی ممکن است عکس شما کمی به رنگ سبز متمایل شود.
با یک مثال به درک بهتر مسیله میپردازیم. فرض کنید با یک تلفن همراه با صفحه ی Full HD و یک دوربین ۱۲ MP یک عکس گرفته شده است. سایز عکس گرفته شده ۳۰۰۰*۴۰۰۰ پیکسل می باشد، مقدار حافظه ای که نیاز است تا بتوانیم عکس را نمایش دهیم ۴۸ مگابایت می باشد، به نظر شما مقدار زیادی برای نمایش یک عکس نیست ؟
۴ بایت * ۴۰۰۰ * ۳۰۰۰ = ۴۸ مگابایت اشغال حافظه تنها برای یک عکس
کمی موشکافانه تر به این موضوع نگاه میکنیم، فرض کنید که میخواهیم یک عکس ۳۰۰۰*۴۰۰۰ پیکسل را در تلفن همراه نمایش بدهیم اما سایز صفحه نمایش تلفن همراه ۱۹۲۰*۱۰۸۰ می باشد. بنابراین در بدترین حالت ممکن نباید بیشتر از ۸ مگابایت از فضای حافظه مصرف شود. به رابطه ی زیر توجه کنید :
۴ بایت * ۱۹۲۰ * ۱۰۸۰ = ۸.۳ مگابایت
بنابراین هنگامی که با تصاویر سایز بزرگ مواجه هستید و اپلیکیشن شما بر اساس تصاویر کار میکند، ابعاد صفحه ی نمایش کاربر را بدست آورید، تصاویر را متناسب با صفحه نمایش کاربر crop کنید و سپس تصاویر بهینه را نمایش دهید.
۷. لایه بندی عمیق
در اندروید با استفاده از XML میتوانید به طراحی لایه ها بپردازید. تاکنون فکر کرده اید هنگامی که یک لایه به کاربر نمایش داده میشود چه فرآیند هایی طی میشود ؟ ابتدا XML ها parse میشوند و سپس صفحه ی نمایش کاربر اندازه گیری میشود و المنت ها در جای مناسب خود قرار میگیرند. برای انجام این فرآیندها نیاز به زمان است و این زمان بستگی به پردازنده ی تلفن همراه کاربر دارد.
فرض کنید میخواهیم یک صفحه بزاریم و به صورت ۳ در ۳ عکس درون آن قرار دهیم. یک راه برای انجام این کار استفاده از یک Linear Layout با جهت Vertical می باشد که درون آن ۳ Linear Layout دیگر با وزن های یکسان قرار دارد و درون هرکدام ۳ عکس قرار دارد.
یک مشکل در این نوع لایه بندی مطرح است، لایه بندی تو در تو باعث کاهش Performance اپلیکیشن شما میشود.
آیا راه دیگری برای این نوع لایه بندی وجود دارد ؟ پاسخ این سوال مثبت است، با کمی تلاش میتوانید از لایه بندی تو در تو اجتاب کنید و از Relative Layout یا GridLayout برای این نوع لایه بندی استفاده کنید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.