برخی از کاربران برنامه شما به طور متناوب به اینترنت دسترسی دارند یا محدودیت هایی در میزان اطلاعاتی که می توانند در دستگاه های خود بارگیری کنند دارند. میتوانید با کاهش حجم دادهای که برنامه شما برای دانلود نیاز دارد، کاربران را تشویق به تعامل بیشتر با برنامهتان کنید.
اساسی ترین راه برای کاهش دانلودها این است که فقط آنچه را که نیاز دارید دانلود کنید. از نظر داده، این به معنای پیادهسازی APIهای REST است که به شما امکان میدهد با استفاده از پارامترهایی مانند زمان آخرین بهروزرسانی، معیارهای پرس و جو را تعیین کنید که دادههای برگشتی را محدود میکند.
به طور مشابه، هنگام بارگیری تصاویر، به جای دانلود تصاویر با اندازه کامل که در مشتری کاهش می یابد، تمرین خوبی است که اندازه تصاویر سمت سرور را کاهش دهید.
پاسخ های HTTP را کش
روش مهم دیگر جلوگیری از دانلود داده های تکراری است. میتوانید با استفاده از حافظه پنهان، احتمال بارگیری مکرر همان قطعه داده را کاهش دهید. با ذخیره داده ها و منابع برنامه خود، یک کپی محلی از اطلاعاتی که برنامه شما باید به آن ارجاع دهد ایجاد می کنید. اگر برنامه شما باید چندین بار در یک بازه زمانی کوتاه به یک قسمت از اطلاعات دسترسی پیدا کند، باید آن را فقط یک بار در حافظه پنهان دانلود کنید.
مهم است که تا جایی که ممکن است به طور تهاجمی حافظه پنهان ذخیره کنید تا کل دادههایی را که دانلود میکنید کاهش دهید. همیشه منابع استاتیک، از جمله دانلودهای درخواستی مانند تصاویر در اندازه کامل را تا زمانی که ممکن است در حافظه پنهان نگه دارید. منابع درخواستی باید به طور جداگانه ذخیره شوند تا بتوانید به طور منظم کش درخواستی خود را برای مدیریت اندازه آن شستشو دهید.
برای اطمینان از اینکه حافظه پنهان منجر به نمایش دادههای قدیمی در برنامه شما نمیشود، از کدها و سرصفحههای وضعیت HTTP مناسب مانند ETag
و Last-Modified
header استفاده کنید. این به شما امکان می دهد تعیین کنید که محتوای مرتبط چه زمانی باید به روز شود. به عنوان مثال:
کاتلین
// url represents the website containing the content to place into the cache. val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection val currentTime: Long = System.currentTimeMillis() val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime) // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified }
جاوا
// url represents the website containing the content to place into the cache. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); long currentTime = System.currentTimeMillis(); long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime); // lastUpdateTime represents when the cache was last updated. if (lastModified < lastUpdateTime) { // Skip update } else { // Parse update lastUpdateTime = lastModified; }
می توانید برخی از کتابخانه های شبکه را به گونه ای پیکربندی کنید که به صورت خودکار به این کدهای وضعیت و سرصفحه ها احترام بگذارند. برای مثال، هنگام استفاده از OkHttp ، پیکربندی یک دایرکتوری کش و اندازه حافظه پنهان برای مشتری، کتابخانه را قادر میسازد تا از حافظه پنهان HTTP استفاده کند، همانطور که در نمونه کد زیر نشان داده شده است:
کاتلین
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
جاوا
File cacheDir = Context.getCacheDir(); long cacheSize = 10L * 1024L * 1024L; // 10 MiB OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) .build();
با پیکربندی کش، میتوانید درخواستهای HTTP کاملاً کش شده را مستقیماً از فضای ذخیرهسازی محلی ارائه دهید و نیازی به باز کردن اتصال شبکه را از بین ببرید. پاسخهای ذخیرهشده مشروط میتوانند تازگی خود را از سرور تأیید کنند و هزینه پهنای باند مرتبط با دانلود را حذف کنند. پاسخهای ذخیره نشده در حافظه پنهان پاسخ برای درخواستهای آینده ذخیره میشوند.
با استفاده از Context.getExternalCacheDir()
می توانید داده های غیر حساس را در دایرکتوری حافظه پنهان خارجی مدیریت نشده ذخیره کنید. از طرف دیگر، میتوانید با استفاده از Context.getCacheDir()
دادهها را در حافظه پنهان برنامه مدیریتشده و ایمن ذخیره کنید. توجه داشته باشید که این حافظه پنهان داخلی ممکن است زمانی که سیستم در فضای ذخیرهسازی موجود کم است پاک شود.
از یک مخزن استفاده کنید
برای یک رویکرد پیچیده تر برای ذخیره سازی، الگوی طراحی مخزن را در نظر بگیرید. این شامل ایجاد یک کلاس سفارشی به نام Repository است که یک انتزاع API را بر روی برخی داده ها یا منابع خاص ارائه می دهد. مخزن ممکن است در ابتدا داده های خود را از منابع مختلف، مانند یک سرویس وب راه دور، واکشی کند، اما در تماس های بعدی، یک نسخه ذخیره شده از داده ها را در اختیار تماس گیرندگان قرار می دهد. این لایه غیرمستقیم به شما این امکان را می دهد که یک استراتژی ذخیره سازی قوی که مختص برنامه شما است ارائه دهید. برای اطلاعات بیشتر در مورد استفاده از الگوی مخزن در برنامه خود، به راهنمای معماری برنامه مراجعه کنید.