Pelajari cara menggunakan Library Cronet untuk menjalankan operasi jaringan di aplikasi Android Anda. Cronet adalah stack jaringan Chromium yang disediakan sebagai library untuk Anda gunakan di aplikasi. Untuk mengetahui informasi selengkapnya tentang fitur library, lihat Menjalankan operasi jaringan menggunakan Cronet.
Menyiapkan library dalam project
Ikuti langkah-langkah berikut untuk menambahkan dependensi ke Cronet Library dalam project Anda:
Pastikan Android Studio menyertakan referensi ke Repositori Maven Google dalam file
settings.gradle
project Anda, seperti yang ditunjukkan pada contoh berikut:Groovy
dependencyResolutionManagement { ... repositories { ... google() } }
Kotlin
dependencyResolutionManagement { ... repositories { ... google() } }
Sertakan referensi ke Library Klien Layanan Google Play untuk Cronet di bagian
dependencies
dalam filebuild.gradle
modul aplikasi Anda, seperti yang ditunjukkan dalam contoh berikut:Groovy
dependencies { implementation 'com.google.android.gms:play-services-cronet:18.0.1' }
Kotlin
dependencies { implementation("com.google.android.gms:play-services-cronet:18.0.1") }
Objek CronetEngine
yang dibuat setelah
dependensi ini ditambahkan akan menggunakan Cronet yang dimuat dari layanan Google Play. Panggil
CronetProviderInstaller.installProvider(Context)
sebelum membuat objek CronetEngine
untuk mencegah pengecualian yang tidak terduga
ditampilkan selama pembuatan CronetEngine
karena error seperti perangkat
memerlukan versi layanan Google Play terbaru.
Jika Cronet tidak dapat dimuat dari layanan Google Play, ada
implementasi Cronet API yang kurang berperforma baik yang dapat digunakan. Untuk menggunakan penerapan penggantian ini, bergantung pada org.chromium.net:cronet-fallback
dan panggil new JavaCronetProvider(context).createBuilder()
.
Membuat permintaan jaringan
Bagian ini menunjukkan cara membuat dan mengirim permintaan jaringan menggunakan Library Cronet. Setelah mengirim permintaan jaringan, aplikasi Anda harus memproses respons jaringan.
Membuat dan mengonfigurasi instance CronetEngine
Library ini menyediakan
class CronetEngine.Builder
yang dapat Anda gunakan untuk membuat instance
CronetEngine
. Contoh berikut
menunjukkan cara membuat objek CronetEngine
:
Kotlin
val myBuilder = CronetEngine.Builder(context) val cronetEngine: CronetEngine = myBuilder.build()
Java
CronetEngine.Builder myBuilder = new CronetEngine.Builder(context); CronetEngine cronetEngine = myBuilder.build();
Anda dapat menggunakan class Builder
untuk mengonfigurasi
objek CronetEngine
. Misalnya, Anda dapat
memberikan opsi seperti penyimpanan cache dan kompresi data. Untuk mengetahui informasi selengkapnya, lihat
CronetEngine.Builder
.
Menyediakan penerapan callback permintaan
Untuk menyediakan implementasi callback, buat subclass
UrlRequest.Callback
, lalu
implementasikan metode abstrak yang diperlukan, seperti ditunjukkan dalam contoh berikut:
Kotlin
private const val TAG = "MyUrlRequestCallback" class MyUrlRequestCallback : UrlRequest.Callback() { override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) { Log.i(TAG, "onRedirectReceived method called.") // You should call the request.followRedirect() method to continue // processing the request. request?.followRedirect() } override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) { Log.i(TAG, "onResponseStarted method called.") // You should call the request.read() method before the request can be // further processed. The following instruction provides a ByteBuffer object // with a capacity of 102400 bytes for the read() method. The same buffer // with data is passed to the onReadCompleted() method. request?.read(ByteBuffer.allocateDirect(102400)) } override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) { Log.i(TAG, "onReadCompleted method called.") // You should keep reading the request until there's no more data. byteBuffer.clear() request?.read(byteBuffer) } override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { Log.i(TAG, "onSucceeded method called.") } }
Java
class MyUrlRequestCallback extends UrlRequest.Callback { private static final String TAG = "MyUrlRequestCallback"; @Override public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) { Log.i(TAG, "onRedirectReceived method called."); // You should call the request.followRedirect() method to continue // processing the request. request.followRedirect(); } @Override public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { Log.i(TAG, "onResponseStarted method called."); // You should call the request.read() method before the request can be // further processed. The following instruction provides a ByteBuffer object // with a capacity of 102400 bytes for the read() method. The same buffer // with data is passed to the onReadCompleted() method. request.read(ByteBuffer.allocateDirect(102400)); } @Override public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) { Log.i(TAG, "onReadCompleted method called."); // You should keep reading the request until there's no more data. byteBuffer.clear(); request.read(byteBuffer); } @Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { Log.i(TAG, "onSucceeded method called."); } }
Membuat objek Executor untuk mengelola tugas jaringan
Anda dapat menggunakan class Executor
untuk menjalankan tugas
jaringan.
Untuk mendapatkan instance Executor
, gunakan salah satu
metode statis class Executors
yang menampilkan
objek Executor
. Contoh berikut menunjukkan cara membuat objek Executor
menggunakan metode
newSingleThreadExecutor()
:
Kotlin
val executor: Executor = Executors.newSingleThreadExecutor()
Java
Executor executor = Executors.newSingleThreadExecutor();
Membuat dan mengonfigurasi objek UrlRequest
Untuk membuat permintaan jaringan, panggil metode
newUrlRequestBuilder()
dari CronetEngine
yang meneruskan
URL tujuan, instance class callback, dan objek eksekutor.
Metode newUrlRequestBuilder()
menampilkan
objek UrlRequest.Builder
yang
dapat Anda gunakan untuk membuat objek UrlRequest
, seperti ditunjukkan dalam contoh berikut:
Kotlin
val requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", MyUrlRequestCallback(), executor ) val request: UrlRequest = requestBuilder.build()
Java
UrlRequest.Builder requestBuilder = cronetEngine.newUrlRequestBuilder( "https://www.example.com", new MyUrlRequestCallback(), executor); UrlRequest request = requestBuilder.build();
Anda dapat menggunakan class Builder
untuk
mengonfigurasi instance UrlRequest
. Misalnya, Anda dapat menentukan prioritas atau kata kerja HTTP. Untuk mengetahui informasi selengkapnya, lihat
UrlRequest.Builder
.
Untuk memulai tugas jaringan, panggil metode
start()
permintaan:
Kotlin
request.start()
Java
request.start();
Dengan mengikuti petunjuk di bagian ini, Anda dapat membuat dan mengirim permintaan
jaringan menggunakan Cronet. Namun, agar lebih praktis, contoh
implementasi
UrlRequest.Callback
hanya mencetak
pesan ke log. Bagian berikut menunjukkan cara menyediakan implementasi
callback yang mendukung skenario yang lebih berguna, seperti mengekstrak data dari
respons dan mendeteksi kegagalan dalam permintaan.
Memproses respons jaringan
Setelah Anda memanggil metode start()
, siklus proses permintaan Cronet akan dimulai. Aplikasi Anda harus mengelola
permintaan selama siklus proses ini dengan menentukan callback. Untuk mempelajari
siklus proses lebih lanjut, lihat Siklus proses
permintaan Cronet. Anda dapat menentukan
callback dengan membuat subclass
UrlRequest.Callback
dan
mengimplementasikan metode berikut:
onRedirectReceived()
Dipanggil saat server mengeluarkan kode pengalihan HTTP sebagai respons terhadap permintaan asal. Untuk mengikuti pengalihan ke tujuan baru, gunakan metode
followRedirect()
. Jika tidak, gunakan metodecancel()
. Contoh berikut menunjukkan cara menerapkan metode:Kotlin
override fun onRedirectReceived(request: UrlRequest?, info: UrlResponseInfo?, newLocationUrl: String?) { // Determine whether you want to follow the redirect. ... if (shouldFollow) { request?.followRedirect() } else { request?.cancel() } }
Java
@Override public void onRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) { // Determine whether you want to follow the redirect. … if (shouldFollow) { request.followRedirect(); } else { request.cancel(); } }
onResponseStarted()
Dipanggil saat kumpulan header terakhir diterima. Metode
onResponseStarted()
hanya dipanggil setelah semua pengalihan diikuti. Kode berikut menunjukkan contoh implementasi metode:Kotlin
override fun onResponseStarted(request: UrlRequest?, info: UrlResponseInfo?) { val httpStatusCode = info?.httpStatusCode if (httpStatusCode == 200) { // The request was fulfilled. Start reading the response. request?.read(myBuffer) } else if (httpStatusCode == 503) { // The service is unavailable. You should still check if the request // contains some data. request?.read(myBuffer) } responseHeaders = info?.allHeaders }
Java
@Override public void onResponseStarted(UrlRequest request, UrlResponseInfo info) { int httpStatusCode = info.getHttpStatusCode(); if (httpStatusCode == 200) { // The request was fulfilled. Start reading the response. request.read(myBuffer); } else if (httpStatusCode == 503) { // The service is unavailable. You should still check if the request // contains some data. request.read(myBuffer); } responseHeaders = info.getAllHeaders(); }
onReadCompleted()
Dipanggil setiap kali isi respons telah dibaca. Contoh kode berikut menunjukkan cara mengimplementasikan metode dan mengekstrak isi respons:
Kotlin
override fun onReadCompleted(request: UrlRequest?, info: UrlResponseInfo?, byteBuffer: ByteBuffer?) { // The response body is available, process byteBuffer. ... // Continue reading the response body by reusing the same buffer // until the response has been completed. byteBuffer?.clear() request?.read(myBuffer) }
Java
@Override public void onReadCompleted(UrlRequest request, UrlResponseInfo info, ByteBuffer byteBuffer) { // The response body is available, process byteBuffer. … // Continue reading the response body by reusing the same buffer // until the response has been completed. byteBuffer.clear(); request.read(myBuffer); }
onSucceeded()
Dipanggil saat permintaan jaringan berhasil diselesaikan. Contoh berikut menunjukkan cara mengimplementasikan metode:
Kotlin
override fun onSucceeded(request: UrlRequest?, info: UrlResponseInfo?) { // The request has completed successfully. }
Java
@Override public void onSucceeded(UrlRequest request, UrlResponseInfo info) { // The request has completed successfully. }
onFailed()
Dipanggil jika permintaan gagal karena alasan apa pun setelah metode
start()
dipanggil. Contoh berikut menunjukkan cara mengimplementasikan metode dan mendapatkan informasi terkait error:Kotlin
override fun onFailed(request: UrlRequest?, info: UrlResponseInfo?, error: CronetException?) { // The request has failed. If possible, handle the error. Log.e(TAG, "The request failed.", error) }
Java
@Override public void onFailed(UrlRequest request, UrlResponseInfo info, CronetException error) { // The request has failed. If possible, handle the error. Log.e(TAG, "The request failed.", error); }
onCanceled()
Dipanggil jika permintaan dibatalkan menggunakan metode
cancel()
. Setelah dipanggil, tidak ada metode lain dari classUrlRequest.Callback
yang dipanggil. Anda dapat menggunakan metode ini untuk membebaskan resource yang dialokasikan untuk memproses permintaan. Contoh berikut menunjukkan cara menerapkan metode:Kotlin
override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { // Free resources allocated to process this request. ... }
Java
@Override public void onCanceled(UrlRequest request, UrlResponseInfo info) { // Free resources allocated to process this request. … }