وبلاگ انجمن برنامه نویسی اندروید

p30droid.com
برنامه نویسی اندروید|آموزش برنامه نویسی اندروید|اندروید استودیو
شنبه, ۴ شهریور ۱۳۹۶، ۰۱:۵۳ ب.ظ

Garbage Collection

Garbage Collection چیست؟؟؟

کلاس‎هایی که برای خواناتر کردن برنامه تان می‎نویسید احتمالا یکی از چیزهایی ست که باید بعد از اتمام کار، از نظر مصرف RAM بهینه شوند. اگر درون یک حلقه در هر گام، یک شیء از کلاستان می‎سازید بهتر است راه دیگری را برای اجرا کردن آن قطعه کد انتخاب کنید. درست است که Garbage Collector در اندروید بسیار خوب عمل می‎کند و شما لازم نیست نگران کلاس‎هایتان باشید، اما اگر در کلاستان از Bitmap استفاده می‎کنید، اعتماد کردن به GC کمی ریسک محسوب می‎شود.

اگر در برنامه‎تان از عکس استفاده می‎کنید (که به احتمال خیلی زیاد استفاده می‎کنید) چه این عکس به صورت یک resource برای برنامه‎تان باشد و چه از اینترنت یا حافظه‎ی داخلی بارگذاری شود، یک خطر بسیار جدی برای برنامه‎تان محسوب می‎شود. عکس ها به طور بی‎رحمانه‎ای RAM مصرف می‎کنند و یکی از اصلی ترین علت خطای out of memory هستند.

 

سخت ترین کارتان زمانی است که عکس ها را از اینترنت دریافت می‎کنید و در یک لیست نشان می‎دهید، در این حالت نه حجم عکس مشخص است، نه تعداد آیتم‎هایی که کاربر از لیست می‎تواند ببیند (به علت اندازه‎های مختلف صفحه نمایش).

اندازه‎ی عکس‎ها باید قبل از نمایش داده شدن در برنامه‎تان، بسته به ابعاد ImageView (یا هر ابزاری که عکس را با آن نمایش می‎دهید) کمتر شوند. همچنین باید توجه داشت که در این کم شدن ابعاد، تغییر کیفیت محسوس نداشته باشید.

این روییه چند مرحله و چند پیش زمینه می‎خواهد که به طور خلاصه به آن ها اشاره می‎کنیم.

  1. کاربرد پوشه‎ی values در پوشه‎های پروژه‎ی خود را بشناسید و حالت‎های مختلف این پوشه را در اندازه‎های مختلف صفحه نمایش و موقعیت‎های مختلف پیاده سازی کنید. مثلا values-large برای تبلت‎های 7 و 8 اینچی و values-fa برای زمانی که زبان برنامه، فارسی است. در این پوشه فایلی به نام dimens.xml وجود دارد که بهتر است برای تعیین ابعاد ابزارهای مختلف از این فایل استفاده کنید
  2. صفحه‎ی مربوط به بارگذاری عکس‎های حجیم را در سایت توسعه دهندگان اندروید بخوانید.
  3. کاربرد متدهای کلاس BitmapFactory را بشناسید. متدهایی برای بارگذاری عکس از اینترنت یا حافظه داخلی گوشی در این کلاس وجود دارند که باعث می‎شوند سر و کار شما به این کلاس زیاد بیفتد.
  4. اگر عکسی جزء resource برنامه شما محسوب می‎شود و در پوشه ی drawable قرار دارد، سعی کنید در صورت امکان نسخه‎های مختلفی از نظر ابعاد برای پوشه‎های drawable-small، drawable-medium و… قرار دهید.

 

اگر عکستان قرار است از حافظه‎ی داخلی گوشی بارگذاری شود یا عکسی که توسط دوربین گرفته شده است را می‎خواهید نمایش دهید، می‎توانید با داشتن ابعاد ابزار نمایش دهنده‎ی عکس، از متد Bitmap.createScaledBitmap استفاده کنید، این متد طول و عرض درخواستی شما را می‎گیرد و ابعاد عکس داده شده را کاهش (یا افزایش) می‎دهد. اما مشکلی که این متد دارد این است که کیفیت عکس را به شدت پایین می‎آورد. زیرا بدون انجام نگاشت و عملیات پردازش تصویر، فقط ابعاد عکس را کوچک‎تر می‎کند.

راه دیگری برای کاهش ابعاد عکس وجود دارد. برای این کار، در ابتدا باید ابعاد عکس را بگیرید، و با توجه به ابعاد ابزار نمایش دهنده‎ی عکس، متغیر inSampleSize را محاسبه کنید (متدی برای محاسبه در همان صفحه‎ی توسعه دهندگان وجود دارد) برای این کار حتما باید یک شیء از کلاس  BitmapFactory.Options بسازید و متغیر inJustDecodeBounds را true قرار دهید. سپس بعد از محاسبه‎ی inSampleSize با مقدار false برای متغیر inJustDecodeBounds اقدام به بارگذاری عکس کنید. مانند قطعه کد زیر :

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(“yourImagePath”, opts);
opts.outHeight; //this is the image Height
opts.outWidth; //this is the Image Width
int inSampleSize = CalculateInSampleSize(opts, myImageViewHeight, myImageViewWidth);
opts.inSampleSize = inSampleSize;
opts.inJustDecodeBounds = false;
Bitmap scaledBitmap = BitmapFactory.decodeFile(“yourImagePath”, opts); //this is scaled down picture

 

با این روش شما می‎توانید مطمئن باشید که کیفیت عکس پایین نمی‎آید. اما محدودیتی که این روش دارد این است که متغیر inSampleSize حتما بایستی عددی مجذور 2 باشد، اگر شما عکسی با عرض 650 می‎خواهید، ممکن است متغیر inSampleSize با عدد 2 بتواند عرض را به 700 برساند و با عدد 4، عرض این عکس 350 می‎شود؛ که بیش از حد کوچک است.

پس بهترین راه برای آنکه عکس مورد نظر را دقیقا در ابعادی که می‎خواهید دریافت کنید این است که از متغیر inSampleSize و متد createScaledBitmap به طور همزمان استفاده کنید.




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

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی