Menghindari download yang tidak dioptimalkan

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.

Cara paling mendasar untuk mengurangi download adalah dengan mendownload yang diperlukan saja. Dalam hal data, hal ini berarti menerapkan REST API yang memungkinkan Anda menentukan kriteria kueri yang membatasi data yang ditampilkan menggunakan parameter seperti waktu pembaruan terakhir Anda.

Demikian pula, saat mendownload gambar, sebaiknya kurangi ukuran sisi server gambar, dan bukan mendownload gambar berukuran penuh yang dikurangi pada klien.

Meng-cache respons HTTP

Cara penting lainnya adalah menghindari download data rangkap. Anda dapat mengurangi kemungkinan download bagian data yang sama berulang kali menggunakan cache. Dengan meng-cache 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 jangka waktu yang singkat, Anda hanya perlu mendownloadnya ke cache sekali saja.

Sangat penting untuk melakukan cache se agresif mungkin guna mengurangi jumlah total data yang didownload. Selalu simpan resource statis dalam cache, termasuk download on demand seperti gambar ukuran penuh, selama memungkinkan. Resource on demand harus disimpan secara terpisah agar Anda dapat menghapus cache on-demand secara rutin untuk mengelola ukurannya.

Untuk memastikan penyimpanan cache tidak menyebabkan aplikasi Anda menampilkan data yang tidak berlaku, gunakan kode dan header status HTTP yang sesuai, seperti header ETag dan Last-Modified. Dengan demikian, Anda dapat 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 mengikuti header dan kode status ini secara otomatis. Saat menggunakan OkHttp, misalnya, mengonfigurasi direktori cache dan ukuran cache untuk klien akan memungkinkan library menggunakan 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 menyalurkan permintaan HTTP yang di-cache sepenuhnya langsung dari penyimpanan lokal, sehingga Anda tidak perlu membuka koneksi jaringan. Respons yang di-cache bersyarat dapat memvalidasi keaktualannya dari server, sehingga meniadakan biaya bandwidth yang terkait dengan download. Respons yang tidak di-cache disimpan dalam cache respons untuk permintaan mendatang.

Anda dapat meng-cache data tidak sensitif di direktori cache eksternal yang tidak dikelola menggunakan Context.getExternalCacheDir(). Atau, Anda dapat meng-cache data di cache aplikasi yang terkelola dan aman dengan menggunakan Context.getCacheDir(). Perlu diketahui bahwa cache internal ini akan dihapus saat sistem hampir 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 awalnya dapat mengambil datanya dari berbagai sumber, seperti layanan web jarak jauh, tetapi memberikan versi data yang di-cache dalam panggilan berikutnya kepada pemanggil. Lapisan pengarahan tidak langsung ini memungkinkan Anda menyediakan strategi caching yang efektif dan khusus untuk aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang penggunaan pola Repositori dalam aplikasi, lihat Panduan arsitektur aplikasi.