Beberapa pengguna aplikasi Anda memiliki akses internet yang terputus-putus atau memiliki batasan jumlah informasi yang dapat didownload ke perangkat mereka. Anda dapat mendorong pengguna untuk lebih sering berinteraksi dengan aplikasi Anda dengan mengurangi jumlah data yang perlu didownload oleh aplikasi Anda.
Cara paling mendasar untuk mengurangi download adalah dengan hanya mendownload yang Anda perlukan. Dalam hal data, hal ini berarti menerapkan REST API yang memungkinkan Anda menentukan kriteria kueri yang membatasi data yang ditampilkan menggunakan parameter seperti waktu update terakhir.
Demikian pula, saat mendownload gambar, sebaiknya kurangi ukuran gambar di sisi server, daripada mendownload gambar ukuran penuh yang dikurangi di klien.
Menyimpan respons HTTP dalam cache
Cara penting lainnya adalah menghindari download data rangkap. Anda dapat mengurangi kemungkinan mendownload bagian data yang sama berulang kali dengan menggunakan caching. Dengan meng-cache data dan resource aplikasi, Anda membuat salinan lokal informasi yang perlu dirujuk oleh aplikasi. Jika aplikasi Anda perlu mengakses informasi yang sama beberapa kali dalam jangka waktu singkat, Anda hanya perlu mendownloadnya ke dalam cache satu kali.
Penting untuk melakukan cache seagresif mungkin guna mengurangi jumlah total data yang Anda download. Selalu simpan resource statis dalam cache, termasuk download on-demand seperti gambar ukuran penuh, selama mungkin. Resource on-demand harus disimpan secara terpisah agar Anda dapat secara rutin mengosongkan cache on-demand untuk mengelola ukurannya.
Untuk memastikan bahwa caching tidak menyebabkan aplikasi Anda menampilkan data yang sudah tidak berlaku, gunakan kode status HTTP dan header yang sesuai, seperti header ETag dan Last-Modified. Hal ini memungkinkan Anda menentukan kapan konten terkait harus
dimuat ulang. Contoh:
Kotlin
// 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 }
Java
// 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; }
Anda dapat mengonfigurasi beberapa library jaringan untuk mematuhi kode status dan header ini secara otomatis. Saat menggunakan OkHttp, misalnya, mengonfigurasi direktori cache dan ukuran cache untuk klien akan memungkinkan library menggunakan caching HTTP, seperti yang ditunjukkan dalam contoh kode berikut:
Kotlin
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
Java
File cacheDir = Context.getCacheDir(); long cacheSize = 10L * 1024L * 1024L; // 10 MiB OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(cacheDir, cacheSize)) .build();
Dengan cache yang dikonfigurasi, Anda dapat menyajikan permintaan HTTP yang di-cache sepenuhnya langsung dari penyimpanan lokal, sehingga tidak perlu membuka koneksi jaringan. Respons yang di-cache secara bersyarat dapat memvalidasi kebaruannya dari server, sehingga menghilangkan biaya bandwidth yang terkait dengan download. Respons yang tidak di-cache akan disimpan di cache respons untuk permintaan mendatang.
Anda dapat meng-cache data yang tidak sensitif di direktori cache eksternal yang tidak dikelola dengan
menggunakan
Context.getExternalCacheDir().
Atau, Anda dapat meng-cache data di cache aplikasi yang aman dan terkelola dengan menggunakan Context.getCacheDir().
Perhatikan bahwa cache internal ini dapat dihapus saat sistem kehabisan
penyimpanan yang tersedia.
Menggunakan repositori
Untuk pendekatan caching yang lebih canggih, pertimbangkan pola desain Repositori. Hal ini melibatkan pembuatan class kustom, yang dikenal sebagai Repositori, yang menyediakan abstraksi API atas beberapa data atau resource tertentu. Repositori mungkin awalnya mengambil datanya dari berbagai sumber, seperti layanan web jarak jauh, tetapi menyediakan versi data yang di-cache kepada pemanggil dalam panggilan berikutnya. Lapisan indireksi ini memungkinkan Anda menyediakan strategi caching yang kuat dan khusus untuk aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang penggunaan pola Repositori dalam aplikasi Anda, lihat Panduan arsitektur aplikasi.