Menghindari download yang tidak dioptimalkan

Beberapa pengguna aplikasi Anda memiliki akses internet yang terputus-putus atau memiliki batasan tentang jumlah informasi yang dapat mereka unduh ke perangkat mereka. Anda dapat mendorong pengguna untuk lebih sering berinteraksi dengan aplikasi Anda dengan mengurangi jumlah data yang harus diunduh aplikasi Anda.

Cara paling mendasar untuk mengurangi download adalah dengan mengunduh apa yang Anda butuhkan. Dalam hal data, itu berarti menerapkan REST API yang memungkinkan Anda untuk menentukan kriteria kueri yang membatasi data yang dihasilkan dengan menggunakan parameter seperti waktu pembaruan terakhir Anda.

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

Menyimpan respons HTTP dalam cache

Cara penting lainnya adalah menghindari download data rangkap. Anda dapat mengurangi kemungkinan mengunduh bagian data yang sama berulang kali dengan menggunakan dalam cache. Dengan meng-cache data dan resource aplikasi, Anda membuat salinan lokal dari informasi yang perlu direferensikan oleh aplikasi Anda. Jika aplikasi Anda perlu mengakses informasi yang sama beberapa kali dalam periode waktu yang singkat, Anda perlu untuk mengunduhnya ke dalam {i>cache<i} hanya sekali.

Sangat penting untuk melakukan {i>cache<i} seaktif mungkin untuk mengurangi jumlah data yang didownload. Selalu cache resource statis, termasuk download sesuai permintaan seperti gambar ukuran penuh, selama durasi yang wajar sebaik mungkin. Sumber daya on-demand harus disimpan secara terpisah agar Anda dapat menghapus cache sesuai permintaan secara teratur untuk mengelola ukurannya.

Untuk memastikan bahwa caching Anda tidak menyebabkan aplikasi menampilkan data usang, gunakan kode status HTTP yang sesuai dan header, seperti ETag dan Last-Modified {i>header<i}. Hal ini memungkinkan Anda menentukan kapan konten terkait 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 mengkonfigurasi beberapa {i>library<i} jaringan untuk mengikuti kode status ini dan {i>header<i} secara otomatis. Saat menggunakan OkHttp, misalnya, mengonfigurasi direktori cache dan ukuran cache untuk klien akan memungkinkan library untuk menggunakan Penyimpanan 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 bisa langsung menyalurkan permintaan HTTP yang di-cache sepenuhnya dari penyimpanan lokal, sehingga tidak perlu untuk membuka koneksi jaringan. Respons yang di-cache secara bersyarat dapat memvalidasi keaktualannya dari server, menghilangkan biaya {i>bandwidth<i} yang terkait dengan unduhan. Respons yang tidak disimpan dalam cache disimpan dalam cache respons untuk permintaan berikutnya.

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 dalam cache aplikasi yang aman dan terkelola dengan menggunakan Context.getCacheDir() Perlu diketahui bahwa cache internal ini dapat dikosongkan bila sistem hampir kehabisan dan penyimpanan yang tersedia.

Menggunakan repositori

Untuk pendekatan caching yang lebih canggih, pertimbangkan desain Repositori pola. Hal ini melibatkan pembuatan kelas khusus, yang dikenal sebagai Repositori, yang menyediakan abstraksi API pada beberapa data atau resource tertentu. Repositori awalnya mungkin mengambil datanya dari berbagai sumber, seperti layanan web jarak jauh, tetapi memberikan versi data yang di-cache dalam panggilan berikutnya kepada pemanggil. Ini tidak langsung memungkinkan Anda menyediakan strategi {i>caching<i} yang tangguh dan khusus untuk aplikasi Anda. Untuk informasi selengkapnya tentang penggunaan pola Repositori dalam aplikasi Anda, lihat Panduan aplikasi arsitektur ini.