مشخصات مقاله
-
2627
-
0.0
-
3325
-
0
-
0
نحوه ی بهینه سازی حافظه و افزایش کارایی در اندروید
بهینه سازی memory در android, بهینه سازی حافظه در اندروید
در این فصل به مبحث بهینه سازی استفاده از حافظه و بهبود کارایی در برنامه های اندروید خواهیم پرداخت .
فهرست محتوا
1. حافظه ی اندروید و افزایش کارایی آن
- چرا دستگاه اندروید خاص است ؟
- اجتناب از ایجاد شئ
- بهره گیری از ساختارهای داده ای کارامد
2. مدیریت نقشه های بیتی (bitmaps)
حافظه ی اندروید و افزایش کارایی آن
چرا دستگاه اندروید خاص است ؟
دستگاه های اندروید طبیعتاً در مقایسه با دیگر دستگاه های هوشمند از قبیل رایانه های رومیزی و نوت بوک از باتری ضعیف تری برخوردار هستند, بهمین دلیل توصیه می شود درباره ی مصرف حافظه توجه لازم را داشته باشید .
بخصوص در دستگاه هایی که ویرایش های قدیمی تر از 5.0 (lollipop) بر روی آن نصب است, توصیه می شود از راه اندازی زباله روب (garbage collector) بر روی آن خودداری کرد, به این خاطر که این امر منجر به بروز حالت freeze در runtime اندروید به مدت 200 هزارم ثانیه می شود . این امر تاخیر قابل توجهی است به خصوص زمانی که کاربر در حال انجام کارهایی مثل پیمایش در لیست (scroll) است .
در زیر لیستی از کارهایی که باید از انجام آن ها در اندروید خودداری کرد .
اجتناب از ایجاد شئ
از ایجاد شئ به خصوص در جاهایی مثل loops (حلقه ها) یا متد Draw () خودداری کنید . در صورت امکان اشیإ موجود را مجدداً مورد استفاده قرار دهید .
بهره گیری از ساختارهای داده ای کارامد
اندروید چندین پیاده سازی از کلاس های Sparse*Array ارائه می دهد . کد زیر را در نظر بگیرید .
Mapmap = new HashMap ();
بکارگیری این کد منجر به ایجاد اشیإ غیر ضروری Integer می شود . پیشنهاد می کنیم از ساختار داده ی زیر برای این منظور استفاده کنید .
SparseArraymap = new SparseArray (); map.put(1, "Hello");
مدیریت نقشه های بیتی (bitmaps)
نقشه های بیتی ممکن است مقدار زیادی حافظه را به خود تخصیص دهند به خصوص اگر در اندازه ی کامل بارگذاری شوند, بهمین دلیل توصیه می شود نقشه های بیتی را با اندازه ی مورد نیاز داخل حافظه بارگذاری کنید . فرض کنید برنامه ی کاربردی دارید که تصویری را در مقیاس (پیکسل بندی مستقل از دستگاه) 100x100 dp نمایش می دهد, شما باید این تصویر را درست در همین اندازه بارگذاری کنید .
یک روش معمول این است که اول نقشه ی بیتی را بدون بارگذاری آن از طریق flag ی که به BitmapFactory ارسال شده باشد اندازه گیری کرد
// instruct BitmapFactory to only the bounds and type of the image BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); // get width and height int imageHeight = options.outHeight; int imageWidth = options.outWidth; // type of the image String imageType = options.outMimeType;
سپس می توانید نسخه ی مقیاس بندی شده ی این عکس را بارگذاری کنید . در مجموع اندروید در مقیاس بندی تصاویر بر توان 2 بسیار کارامد عمل می کند . می توانید با استفاده از عملیات / method ذیل (که از مستندات رسمی اندروید / official android documentation برگرفته شده) فاکتور مقایس بندی یا اندازه بندی مجدد را بر پایه ی 2 محاسبه کنید .
public static Bitmap decodeBitmapWithGiveSizeFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
همان طور که در مثال زیر مشاهده می کنید, از این متد می توان جهت تخصیص تصویر به یک view بهره گرفت.
viewWidth = imageView.getWidth(); viewHeight = imageView.getHeight(); imageView. imageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(), R.id.myimage, viewWidth, viewHeight));