ذخیره و نمایش عکس های دانلودی
سلام دوستان
من یه برنامه دارم که توش تصویرهای زیادی وجود داره و باید از سرور دانلود بشه ، من دارم از رتروفیت استفاده می کنم برای دانلود عکس هام و یک سوالی برای پیش اومده.
الان من عکسی رو که دانلود می کنم یه فولدر داخل گوشی درست می کنم و عکس ها رو اونجا قرار می دم و هر موقع لازم شد از روی کارت حافظه می خونم منتها من هر برنامه ای رو دیدم این کار رو نکرده ، مثلا بازار این همه تصویر که نمایش میده رو اصلا روی کارت حافظه قرار نمیده که بعدش بخواد از روی حافظه بخونه (حداقل تا اینجا که من فهمیدم :) ) . ممنون میشم یه راهنمایی به من بدید که اصلا این کار درستی هست که من انجام میدم یا اینکه راه بهتری هم هستش.
ممنون
دوست عزیز از کتابخانه Glide برای لود سریع عکس و همچنین کش کردن ( یعنی یکبار دانلود و ذخیره در پوشه روت برنامه و عدم دانلود دوباره در اجراهای بعدی) استفاده می کنند. این عکس ها چون در پوشه روت گوشی ذخیره میشوند دیگر در گالری قابل مشاهده نیستند.
بعد از اضافه کردن کتابخانه به پروژتون از این کد استفاده کنید :
Glide.with(context) .load( "http://futurestud.io/icon.png" ) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(imageView);
Look This Link : https://stackoverflow.com/questions/37964187/preload-multiple-images-with-glide
شیوه ی دیگری که می توانید از آن طریق کارایی را بهبود ببخشید, ذخیره سازی موقت اشیإ سنگین و پر حجم است, به عنوان مثال در صورت دانلود تصاویر برای نمایش در ListView, باید آن ها را در حافظه ی پنهان نگه داشته تا از این طریق از دانلود مجدد آن ها در آینده خودداری کنید . حافظه ی پنهان LRU (least recently used) حساب استفاده از تمامی اعضای خود را دارد . آیتم نام برده دارای یک ظرفیت معین است و در صورت پر شدن آن ظرفیت, حافظه ی مزبور آیتم هایی که طولانی مدت مورد استفاده قرار نگرفته اند را حذف می کند .
این رفتار در تصویر زیر به نمایش گذاشته شده است :
اندروید, کلاس LruCache را از رابط برنامه سازی کاربردی 12 API به بعد (یا کتابخانه ی پشتیبانی نسخه ی 4) در اختیار برنامه نویس قرار می دهد . کلاس مذکور قابلیت پیاده سازی حافظه ی پنهان Least Recently Used را در اختیار برنامه نویس قرار می دهد . مثال :
public class ImageCache extends LruCache<string, bitmap=""> {
public ImageCache(int maxSize) { super(maxSize); }
@Override protected int sizeOf(String key, Bitmap value) {
return value.getByteCount(); }
@Override protected void entryRemoved(boolean evicted
, String key, Bitmap oldValue, Bitmap newValue) { oldValue.recycle(); } }
به منظور دستیابی به ظرفیت اولیه حافظه ی پنهان, می توان از MemoryClass بهره گرفت و بدین ترتین تنها از مقدار ناچیزی از کل حافظه ی در دسترس استفاده کرد . :
int memClass = ((ActivityManager)activity.getSystemService(Context.ACTIVITY_SERVICE))
.getMemoryClass(); int cacheSize = 1024 * 1024 * memClass / 8;
LruCache cache = new LruCache<string, bitmap="">(cacheSize)
توی اون لینک استکی که براتون فرستادم یه نمونه از همین کاربرد وجود داره.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .