Beberapa pengguna aplikasi Anda memiliki akses intermiten ke internet atau memiliki batasan jumlah informasi yang dapat mereka download ke perangkatnya. Anda dapat mendorong pengguna agar lebih sering berinteraksi dengan aplikasi Anda melalui pengurangan jumlah data yang perlu didownload aplikasi.
Cara paling mendasar untuk mengurangi download adalah dengan mendownload hal yang dibutuhkan saja. Perihal data, caranya yaitu mengimplementasikan REST API untuk memungkinkan Anda menentukan kriteria kueri yang membatasi data ditampilkan menggunakan berbagai parameter, seperti waktu update terakhir.
Demikian pula saat mendownload gambar, sebaiknya Anda mengurangi ukuran gambar sisi server, dan bukan mendownload gambar berukuran penuh yang dikurangi pada sisi klien.
Respons HTTP cache
Cara penting lainnya adalah menghindari download data rangkap. Anda dapat mengurangi kemungkinan download bagian data yang sama secara berulang dengan melakukan caching. Dengan melakukan caching pada data dan resource aplikasi, Anda akan membuat salinan lokal informasi yang perlu dirujuk oleh aplikasi. Jika aplikasi Anda perlu mengakses informasi yang sama beberapa kali selama periode waktu yang singkat, Anda hanya perlu mendownloadnya ke dalam cache satu kali.
Sangat penting untuk melakukan cache seaktif mungkin demi mengurangi jumlah total data yang didownload. Selalu lakukan cache resource statis, termasuk download sesuai permintaan seperti gambar ukuran penuh, selama masih dalam batas wajar. Resource sesuai permintaan harus disimpan secara terpisah agar Anda dapat membersihkan cache sesuai permintaan Anda secara teratur untuk mengelola ukurannya.
Untuk memastikan bahwa caching Anda tidak menyebabkan aplikasi menampilkan data basi, gunakan kode status dan header HTTP yang sesuai, seperti header ETag
dan Last-Modified
. Hal ini memungkinkan Anda menentukan kapan konten terkait harus diperbarui. 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 penyimpanan dalam cache 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 melayani permintaan HTTP yang di-cache sepenuhnya langsung dari penyimpanan lokal, sehingga tidak perlu membuka koneksi jaringan. Respons yang di-cache secara bersyarat dapat memvalidasi sifat baru dari server, meniadakan biaya bandwidth yang terkait dengan download. Respons yang tidak di-cache akan disimpan dalam cache respons untuk permintaan mendatang.
Anda dapat melakukan cache data tidak sensitif di direktori cache eksternal yang tidak dikelola dengan
menggunakan
Context.getExternalCacheDir()
.
Atau, Anda dapat menyimpan data dalam cache aplikasi yang dikelola dan aman dengan
menggunakan
Context.getCacheDir()
.
Perhatikan bahwa cache internal ini dapat dihapus saat sistem hampir kehabisan ruang penyimpanan yang tersedia.
Menggunakan repositori
Untuk pendekatan caching yang lebih canggih, pertimbangkan pola desain Repository. Hal ini melibatkan pembuatan class kustom, yang dikenal sebagai Repositori, yang menyediakan abstraksi API atas beberapa data atau resource tertentu. Repositori dapat mengambil datanya dari berbagai sumber pada awalnya, seperti layanan web jarak jauh, tetapi memberikan versi data yang di-cache kepada pemanggil dalam panggilan berikutnya. Lapisan pengalihan ini memungkinkan Anda memberikan strategi caching yang andal dan khusus untuk aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang penggunaan pola Repository dalam aplikasi Anda, lihat Panduan arsitektur aplikasi.