برخی از کاربران برنامه شما به طور متناوب به اینترنت دسترسی دارند یا محدودیتهایی در میزان اطلاعاتی که میتوانند روی دستگاههای خود دانلود کنند، دارند. شما میتوانید با کاهش میزان دادهای که برنامه شما برای دانلود نیاز دارد، کاربران را به تعامل بیشتر با برنامه خود تشویق کنید.
اساسیترین راه برای کاهش دانلودها، دانلود فقط چیزهایی است که نیاز دارید. در مورد دادهها، این به معنای پیادهسازی APIهای REST است که به شما امکان میدهند معیارهای پرسوجو را مشخص کنید که دادههای برگشتی را با استفاده از پارامترهایی مانند زمان آخرین بهروزرسانی شما محدود میکند.
به همین ترتیب، هنگام دانلود تصاویر، بهتر است اندازه تصاویر را در سمت سرور کاهش دهید، نه اینکه تصاویر با اندازه کامل را که در سمت کلاینت کوچک شدهاند، دانلود کنید.
پاسخهای HTTP را ذخیره کنید
یکی دیگر از تکنیکهای مهم، جلوگیری از دانلود دادههای تکراری است. شما میتوانید با استفاده از ذخیرهسازی، احتمال دانلود مکرر یک قطعه داده را کاهش دهید. با ذخیرهسازی دادهها و منابع برنامه خود، یک کپی محلی از اطلاعاتی که برنامه شما نیاز به ارجاع دارد، ایجاد میکنید. اگر برنامه شما نیاز دارد که در یک بازه زمانی کوتاه، چندین بار به یک قطعه اطلاعات دسترسی داشته باشد، باید آن را فقط یک بار در حافظه پنهان دانلود کنید.
برای کاهش حجم کل دادههایی که دانلود میکنید، مهم است که تا حد امکان به طور جدی حافظه پنهان (cache) را ذخیره کنید. همیشه منابع استاتیک، از جمله دانلودهای درخواستی مانند تصاویر با اندازه کامل، را تا زمانی که به طور منطقی امکان دارد، ذخیره کنید. منابع درخواستی باید جداگانه ذخیره شوند تا بتوانید به طور منظم حافظه پنهان درخواستی خود را خالی کنید تا حجم آن را مدیریت کنید.
برای اطمینان از اینکه ذخیره سازی شما منجر به نمایش دادههای قدیمی در برنامهتان نمیشود، از کدهای وضعیت HTTP و هدرهای مناسب، مانند هدرهای ETag و Last-Modified استفاده کنید. این به شما امکان میدهد تعیین کنید که محتوای مرتبط چه زمانی باید بهروزرسانی شود. به عنوان مثال:
کاتلین
// 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 را در نظر بگیرید. این الگو شامل ایجاد یک کلاس سفارشی، معروف به Repository، است که یک انتزاع API را بر روی برخی دادهها یا منابع خاص ارائه میدهد. مخزن ممکن است در ابتدا دادههای خود را از منابع مختلفی مانند یک سرویس وب از راه دور دریافت کند، اما در فراخوانیهای بعدی، نسخهای ذخیرهسازی شده از دادهها را در اختیار تماسگیرندگان قرار میدهد. این لایه از تعامل غیرمستقیم به شما امکان میدهد یک استراتژی ذخیرهسازی قوی ارائه دهید که مختص برنامه شما باشد. برای اطلاعات بیشتر در مورد استفاده از الگوی Repository در برنامه خود، به راهنمای معماری برنامه مراجعه کنید.