Saya ingin menangani situasi ketika tidak ada koneksi internet. Biasanya saya akan lari:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
(dari sini ) sebelum mengirim permintaan ke jaringan dan memberi tahu pengguna jika tidak ada koneksi internet.
Dari apa yang saya lihat Retrofit tidak menangani situasi ini secara khusus. Jika tidak ada koneksi internet, saya hanya akan mendapatkan RetrofitError
waktu tunggu sebagai alasan.
Jika saya ingin memasukkan pemeriksaan semacam ini ke dalam setiap permintaan HTTP dengan Retrofit, bagaimana saya harus melakukannya? Atau haruskah saya melakukannya sama sekali.
Terima kasih
Alex
Jawaban:
Apa yang akhirnya saya lakukan adalah membuat klien Retrofit khusus yang memeriksa konektivitas sebelum menjalankan permintaan dan membuat pengecualian.
lalu gunakan saat mengkonfigurasi
RestAdapter
sumber
NoConnectivityException
, Anda dapat memperpanjangIOException
atau memperpanjangRuntimeException
Sejak retrofit,
1.8.0
ini sudah tidak digunakan lagiAnda harus menggunakan
ada beberapa jenis kesalahan yang dapat Anda tangani:
NETWORK
IOException terjadi saat berkomunikasi ke server, misalnya Timeout, Tidak ada koneksi, dll ...CONVERSION
Pengecualian diberikan saat (de) membuat serialisasi tubuh.HTTP
Kode status HTTP non-200 diterima dari server misalnya 502, 503, dll ...UNEXPECTED
Terjadi kesalahan internal saat mencoba menjalankan permintaan. Praktik terbaiknya adalah membuang kembali pengecualian ini sehingga aplikasi Anda mogok.sumber
equals
variabel berlebih, selalu gunakanCONSTANT.equals(variable)
sebagai gantinya untuk menghindari kemungkinan NullPointerException. Atau bahkan lebih baik dalam hal ini, enum menerima == perbandingan jadierror.getKind() == RetrofitError.Kind.NETWORK
mungkin pendekatan yang lebih baikDengan Retrofit 2, kami menggunakan implementasi OkHttp Interceptor untuk memeriksa konektivitas jaringan sebelum mengirim permintaan. Jika tidak ada jaringan, berikan pengecualian yang sesuai.
Ini memungkinkan seseorang untuk secara khusus menangani masalah konektivitas jaringan sebelum mencapai Retrofit.
sumber
OkHttpClient.Builder.addInterceptor(new ConnectivityInterceptor(HERE))
Apa yang seharusnya ada di SINI?@AlexV Anda yakin bahwa RetrofitError berisi batas waktu sebagai alasan (SocketTimeOutException saat getCause () dipanggil) saat tidak ada sambungan internet?
Sejauh yang saya tahu ketika tidak ada koneksi internet, RetrofitError berisi ConnectionException sebagai penyebabnya.
Jika Anda menerapkan ErrorHandler, Anda dapat melakukan sesuatu seperti ini:
sumber
isNetworkError
menyingkirkan tidak dapat menyelesaikan kesalahan host?error.getKind() == RetrofitError.Kind.NETWORK
Untuk Retrofit 1
Ketika Anda mendapatkan
Throwable
kesalahan dari permintaan http Anda, Anda dapat mendeteksi apakah itu kesalahan jaringan dengan metode seperti ini:sumber
cukup lakukan ini, Anda akan diberi tahu bahkan untuk masalah seperti
,
dan lain-lain.
sumber
Anda dapat menggunakan kode ini
Response.java
NetworkError.java
Implementasi dalam metode Anda
sumber