Saya mendapatkan AsyncTask
yang seharusnya memeriksa akses jaringan ke nama host. Tetapi doInBackground()
tidak pernah habis waktu. Adakah yang punya petunjuk?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
android
networking
asynchronous
Vidar Vestnes
sumber
sumber
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Lihat jawaban saya untuk implementasi yang lebih baik dari ini. Btw jawaban yang diterima (dan banyak lainnya di sini) hanya memeriksa koneksi jaringan , bukan internet.Jawaban:
Koneksi jaringan / akses Internet
isConnectedOrConnecting()
(digunakan dalam sebagian besar jawaban) memeriksa koneksi jaringan apa punA) Ping Server (mudah)
+
bisa berjalan di utas utama-
tidak berfungsi pada beberapa perangkat lama (Galays S3, dll.), itu memblokir sementara jika tidak ada internet tersedia.B) Hubungkan ke Socket di Internet (lanjutan)
+
sangat cepat (bagaimanapun juga), bekerja pada semua perangkat, sangat dapat diandalkan-
tidak dapat berjalan di utas UIIni bekerja sangat andal, di setiap perangkat, dan sangat cepat. Perlu dijalankan dalam tugas yang terpisah (misalnya
ScheduledExecutorService
atauAsyncTask
).Kemungkinan Pertanyaan
Apakah ini cukup cepat?
Ya, sangat cepat ;-)
Apakah tidak ada cara yang dapat diandalkan untuk memeriksa internet, selain menguji sesuatu di internet?
Tidak sejauh yang saya tahu, tetapi beri tahu saya, dan saya akan mengedit jawaban saya.
Bagaimana jika DNSnya down?
Google DNS (mis.
8.8.8.8
) Adalah DNS publik terbesar di dunia. Per 2013 melayani 130 miliar permintaan per hari. Katakan saja, aplikasi Anda mungkin tidak akan menjadi pembicaraan saat ini.Izin mana yang diperlukan?
Hanya akses internet - kejutan ^^ (Btw apakah Anda pernah memikirkan, bagaimana beberapa metode yang disarankan di sini bahkan dapat memiliki lem jarak jauh tentang akses internet, tanpa izin ini?)
Ekstra:
AsyncTask
Contoh Satu KaliExtra:
RxJava/RxAndroid
Contoh Satu Kali (Kotlin)sumber
Jika perangkat dalam mode pesawat (atau mungkin dalam situasi lain di mana tidak ada jaringan yang tersedia),
cm.getActiveNetworkInfo()
akannull
, jadi Anda perlu menambahkan tandanull
centang.Dimodifikasi ( solusi Eddie ) di bawah:
Tambahkan juga izin berikut ke
AndroidManifest.xml
:Satu titik kecil lainnya, jika Anda benar-benar membutuhkan koneksi jaringan pada titik waktu tertentu, maka mungkin lebih baik untuk menggunakannya
netInfo.isConnected()
daripadanetInfo.isConnectedOrConnecting
. Saya kira ini tergantung kasus penggunaan individu.sumber
context.getSystemService
atau tidak berfungsi. Saya mendapat petunjuk saya di sini androidhive.info/2012/07/...Tidak perlu rumit. Cara paling sederhana dan kerangka kerja adalah dengan menggunakan
ACCESS_NETWORK_STATE
izin dan hanya membuat metode yang terhubungAnda juga dapat menggunakan
requestRouteToHost
jika Anda memiliki host dan tipe koneksi tertentu (wifi / ponsel) dalam pikiran.Anda juga perlu:
di manifes Android Anda.
sumber
context.getSystemService
atau tidak berfungsi. Saya mendapat petunjuk saya di sini androidhive.info/2012/07/...getAllNetworkInfo()
sudah tidak digunakan lagi di API level 29Untuk mulai
getActiveNetworkInfo()
bekerja, Anda perlu menambahkan yang berikut ke manifes.sumber
getActiveNetworkInfo()
tidak digunakan dalam API level 29.Lihatlah kelas ConnectivityManager. Anda dapat menggunakan kelas ini untuk mendapatkan informasi tentang koneksi aktif pada host. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDIT: Anda bisa menggunakan
atau
dan parsing detailState enum objek NetworkInfo yang dikembalikan
EDIT EDIT: Untuk mengetahui apakah Anda dapat mengakses host, Anda dapat menggunakan
Jelas, saya menggunakan Context.getSystemService (Context.CONNECTIVITY_SERVICE) sebagai proxy untuk mengatakan
sumber
periksa kode ini ... itu berhasil untuk saya :)
Lalu, saya mendefinisikan pawang:
... dan luncurkan tes:
sumber
Ditemukan di dan dimodifikasi (!) Dari tautan ini :
Dalam file manifes Anda, tambahkan setidaknya:
Anda mungkin sudah memiliki izin INTERNET jika Anda mengaksesnya. Maka fungsi boolean yang memungkinkan untuk menguji konektivitas adalah:
sumber
Saya membuat kode ini, ini adalah yang paling sederhana dan itu hanya boolean. dengan bertanya
if(isOnline()){
Anda dapatkan jika ada koneksi dan jika itu dapat terhubung ke halaman kode status
200
(koneksi stabil).Pastikan untuk menambahkan yang benar
INTERNET
danACCESS_NETWORK_STATE
izin.sumber
Ini berhasil bagi saya:
Untuk memverifikasi ketersediaan jaringan:
Untuk memverifikasi akses internet:
sumber
Ada lebih dari satu cara
Pertama, cara terpendek tetapi tidak efisien
Izin Keadaan Jaringan hanya diperlukan
Maka metode ini,
Seperti yang terlihat dalam jawaban
ConnectivityManager
adalah solusi, saya hanya menambahkannya dalam suatu metode. Ini adalah metode yang disederhanakan semua digunakanConnectivityManager
mengembalikan true jika ada akses jaringan bukan akses Internet, berarti jika WiFi Anda terhubung ke router tetapi router tidak memiliki internet itu mengembalikan true, itu memeriksa ketersediaan koneksiKedua, cara yang efisien
Status Jaringan dan Izin Internet diperlukan
Lalu kelas ini,
Panggilan
CheckInternetAsyncTask
Beberapa Penjelasan: -
Anda harus memeriksa Internet
AsyncTask
, jika tidak maka akan melemparandroid.os.NetworkOnMainThreadException
dalam beberapa kasusConnectivityManager
digunakan untuk memeriksa akses jaringan jika benar mengirim permintaan (Ping)Minta kirim ke
http://clients3.google.com/generate_204
, URL terkenal ini dikenal untuk mengembalikan halaman kosong dengan status HTTP 204 ini lebih cepat dan lebih efisien daripadahttp://www.google.com
, baca ini . jika Anda memiliki situs web, lebih disukai untuk menempatkan situs web Anda daripada google, hanya jika Anda menggunakannya di dalam aplikasiBatas waktu dapat diubah kisaran (20 ms -> 2000 ms), 1500 ms umumnya digunakan
sumber
Dari semua yang saya lihat sejauh ini, jalan terpendek dan terbersih adalah:
PS: Ini tidak ping host mana pun, hanya memeriksa status koneksi, jadi jika router Anda tidak memiliki koneksi internet dan perangkat Anda terhubung dengannya metode ini akan kembali benar meskipun Anda tidak memiliki internet.
Untuk tes yang sebenarnya, saya akan merekomendasikan untuk mengeksekusi permintaan HttpHead (mis. Ke www.google.com) dan memeriksa statusnya, jika 200 OK semuanya baik-baik saja dan perangkat Anda memiliki koneksi internet.
sumber
Inilah metode yang saya gunakan:
Bahkan lebih baik, periksa untuk memastikan "terhubung":
Inilah cara menggunakan metode ini:
Izin diperlukan:
https://stackoverflow.com/a/16124915/950427
sumber
Satu kasus penggunaan penting pada perangkat seluler untuk memastikan koneksi yang sebenarnya ada. Ini adalah masalah umum ketika pengguna seluler memasuki jaringan Wifi dengan "Captive Portal", di mana mereka harus masuk. Saya menggunakan fungsi pemblokiran ini di latar belakang untuk memastikan koneksi ada.
sumber
Anda dapat mengulangi semua koneksi jaringan dan memeriksa apakah ada setidaknya satu koneksi yang tersedia:
sumber
Bagi saya itu bukan praktik yang baik untuk memeriksa status koneksi di kelas Activity, karena
harus dipanggil di sana, atau Anda perlu menekan instance Activity (konteks) Anda ke kelas handler koneksi untuk dapat memeriksa status koneksi di sana Ketika tidak ada koneksi yang tersedia (wifi, jaringan) Saya menangkap pengecualian UnknownHostException :
Dengan cara ini saya dapat menangani kasus ini bersama dengan kasus-kasus lain di kelas yang sama (server saya selalu merespon balik dengan string json)
sumber
Ini bekerja untuk saya. Cobalah.
sumber
Metode ini memberi Anda opsi untuk metode yang sangat cepat (untuk umpan balik waktu nyata) atau metode yang lebih lambat (untuk satu kali pemeriksaan yang memerlukan keandalan)
sumber
Saya menggunakan kode ini sebagai ganti InetAddress:
sumber
Tidak rumit untuk memeriksa status konektivitas jaringan / internet Android. Kelas di bawah ini
DetectConnection
akan membantu Anda memeriksa status ini:Untuk lebih jelasnya kunjungi Cara Memeriksa Status Jaringan Android / Konektivitas Internet
sumber
Pendekatan terbaik:
sumber
Berikut ini adalah kode dari
Utils
kelas saya :sumber
sumber
Anda dapat menggunakan metode ini untuk mendeteksi ketersediaan jaringan-
sumber
Saya telah menerapkan solusi yang disediakan oleh @Levit dan membuat fungsi yang tidak akan memanggil Permintaan Http tambahan.
Ini akan menyelesaikan kesalahan
Unable to Resolve Host
Sebut saja seperti,
sumber
Ini tercakup dalam dokumen Android http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
sumber
Saya telah memeriksa semua jawaban dan saya menemukan jawaban saya sendiri yang pertama-tama memeriksa apakah Internet tersedia dan apakah Internet tersedia kemudian memeriksa apakah itu aktif atau tidak.
Saya telah memasukkan semua metode dan kelas yang diperlukan untuk memeriksa koneksi Internet aktif.
NetworkUtils.class
Anda dapat memeriksa apakah Internet aktif menggunakan kode di bawah ini:
sumber
Sangat penting untuk memeriksa apakah kita memiliki konektivitas dengan isAvailable () dan jika memungkinkan untuk membuat koneksi dengan isConnected ()
dan Anda dapat menghentikan jenis WiFi aktif jaringan :
atau Móvil seluler :
jangan lupa izinnya:
sumber
Kotlin dan coroutine
Saya telah menempatkan fungsi dalam
ViewModel
, yang memilikiviewModelScope
. Menggunakan diamatiLiveData
saya menginformasikan aktivitas tentang koneksi.ViewModel
Aktivitas
sumber
Cukup buat kelas berikut yang memeriksa koneksi internet:
Kelas ini hanya berisi metode yang mengembalikan nilai boolean dari status koneksi. Oleh karena itu, secara sederhana, jika metode ini menemukan koneksi yang valid ke Internet, nilai baliknya adalah
true
, sebaliknyafalse
jika tidak ada koneksi yang valid ditemukan.Metode berikut di MainActivity kemudian memanggil hasil dari metode yang dijelaskan sebelumnya, dan meminta pengguna untuk bertindak sesuai:
Dalam kode di atas, jika hasilnya salah, (karena itu tidak ada koneksi internet, pengguna dibawa ke panel wi-fi Android, di mana ia diminta untuk terhubung ke hotspot wi-fi.
sumber
Pembaruan 29/06/2015 Jika Anda menggunakan Xamarin.Android dan ingin memeriksa konektivitas, Anda dapat menggunakan paket Nuget yang akan memberi Anda fungsionalitas ini pada banyak platform. Kandidat yang baik ada di sini dan di sini . [Akhir Pembaruan]
Jawaban di atas cukup bagus, tetapi semuanya ada di Jawa, dan hampir semuanya memeriksa konektivitas. Dalam kasus saya, saya perlu memiliki konektivitas dengan jenis koneksi tertentu dan saya sedang mengembangkan Xamarin. Android. Selain itu, saya tidak memberikan referensi untuk konteks kegiatan saya di lapisan Perangkat Keras, saya menggunakan Konteks Aplikasi. Jadi, inilah solusi saya, kalau-kalau ada orang datang ke sini dengan persyaratan yang sama. Saya belum melakukan pengujian penuh, akan memperbarui jawaban setelah saya selesai dengan pengujian saya
sumber