Ich habe eine AsyncTask
, die den Netzwerkzugriff auf einen Hostnamen überprüfen soll. Aber das doInBackground()
ist nie abgelaufen. Hat jemand eine Ahnung?
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
quelle
quelle
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Siehe meine Antwort für eine schönere Implementierung davon. Bei der akzeptierten Antwort (und vielen anderen hier) wird nur nach einer Netzwerkverbindung gesucht , nicht nach dem Internet.Antworten:
Netzwerkverbindung / Internetzugang
isConnectedOrConnecting()
Kontrollen für alle (in den meisten Antworten verwendet) Netzwerk - VerbindungA) Pingen Sie einen Server (einfach)
+
könnte auf Haupt-Thread laufen-
funktioniert auf einigen alten Geräten (Galays S3 usw.) nicht, blockiert eine Weile, wenn kein Internet verfügbar ist.B) Stellen Sie eine Verbindung zu einer Steckdose im Internet her (erweitert)
+
sehr schnell (so oder so), funktioniert auf allen Geräten, sehr zuverlässig-
kann nicht auf dem UI-Thread ausgeführt werdenDies funktioniert auf jedem Gerät sehr zuverlässig und ist sehr schnell. Es muss jedoch in einer separaten Aufgabe ausgeführt werden (z . B.
ScheduledExecutorService
oderAsyncTask
).Mögliche Fragen
Ist es wirklich schnell genug?
Ja sehr schnell ;-)
Gibt es keine zuverlässige Möglichkeit, das Internet zu überprüfen, außer etwas im Internet zu testen?
Nicht so weit ich weiß, aber lass es mich wissen, und ich werde meine Antwort bearbeiten.
Was ist, wenn der DNS ausgefallen ist?
Google DNS (z. B.
8.8.8.8
) ist das größte öffentliche DNS der Welt. Ab 2013 wurden täglich 130 Milliarden Anfragen bearbeitet. Sagen wir einfach, Ihre App wäre wahrscheinlich nicht das Tagesgespräch.Welche Berechtigungen sind erforderlich?
Nur Internetzugang - Überraschung ^^ (Übrigens haben Sie jemals darüber nachgedacht, wie einige der hier vorgeschlagenen Methoden ohne diese Erlaubnis sogar einen Fernkleber über den Internetzugang haben könnten?)
Extra: One-Shot-
AsyncTask
BeispielExtra: One-Shot-
RxJava/RxAndroid
Beispiel (Kotlin)quelle
Befindet sich das Gerät im Flugzeugmodus (oder vermutlich in anderen Situationen, in denen kein Netzwerk verfügbar ist),
cm.getActiveNetworkInfo()
müssennull
Sie einenull
Prüfung hinzufügen .Modifiziert ( Eddies Lösung ) unten:
Fügen Sie außerdem die folgende Berechtigung hinzu
AndroidManifest.xml
:Ein weiterer kleiner Punkt: Wenn Sie zum angegebenen Zeitpunkt unbedingt eine Netzwerkverbindung benötigen, ist es möglicherweise besser, diese zu verwenden
netInfo.isConnected()
alsnetInfo.isConnectedOrConnecting
. Ich denke, dies hängt jedoch vom jeweiligen Anwendungsfall ab.quelle
context.getSystemService
funktioniert es nicht. Ich habe meinen Hinweis hier androidhive.info/2012/07/…Keine Notwendigkeit, komplex zu sein. Die einfachste und einfachste
ACCESS_NETWORK_STATE
Methode besteht darin, die Berechtigung zu verwenden und nur eine verbundene Methode zu erstellenSie können es auch verwenden,
requestRouteToHost
wenn Sie einen bestimmten Host- und Verbindungstyp (WLAN / Mobil) im Auge haben.Sie benötigen außerdem:
in Ihrem Android-Manifest.
quelle
context.getSystemService
funktioniert es nicht. Ich habe meinen Hinweis hier androidhive.info/2012/07/…getAllNetworkInfo()
ist in API Level 29Um
getActiveNetworkInfo()
zur Arbeit zu gelangen , müssen Sie dem Manifest Folgendes hinzufügen.quelle
getActiveNetworkInfo()
ist in API-Level 29 veraltet.Schauen Sie sich die ConnectivityManager-Klasse an. Mit dieser Klasse können Sie Informationen zu den aktiven Verbindungen auf einem Host abrufen. http://developer.android.com/reference/android/net/ConnectivityManager.html
EDIT: Sie können verwenden
oder
und analysieren Sie die DetailedState-Enumeration des zurückgegebenen NetworkInfo-Objekts
BEARBEITEN BEARBEITEN: Um herauszufinden, ob Sie auf einen Host zugreifen können, können Sie verwenden
Offensichtlich verwende ich Context.getSystemService (Context.CONNECTIVITY_SERVICE) als Proxy
quelle
Überprüfen Sie diesen Code ... es hat bei mir funktioniert :)
Dann definiere ich den Handler:
... und starten Sie den Test:
quelle
Gefunden bei und geändert (!) Von diesem Link :
Fügen Sie in Ihrer Manifestdatei mindestens Folgendes hinzu:
Sie haben wahrscheinlich bereits die INTERNET-Berechtigung, wenn Sie darauf zugreifen. Dann ist eine boolesche Funktion, mit der die Konnektivität getestet werden kann:
quelle
Ich habe diesen Code gemacht, er ist der einfachste und nur ein Boolescher Wert. durch Fragen
if(isOnline()){
Sie erhalten, wenn eine Verbindung besteht und wenn eine Verbindung zu einer Seite hergestellt werden kann, den Statuscode
200
(stabile Verbindung).Stellen Sie sicher, dass Sie die richtigen
INTERNET
undACCESS_NETWORK_STATE
Berechtigungen hinzufügen .quelle
Es funktioniert bei mir:
So überprüfen Sie die Netzwerkverfügbarkeit:
So überprüfen Sie den Internetzugang:
quelle
Es gibt mehr als einen Weg
Erstens der kürzeste, aber ineffiziente Weg
Netzwerkstatusberechtigung nur erforderlich
Dann diese Methode,
Wie aus den Antworten hervorgeht,
ConnectivityManager
handelt es sich um eine Lösung. Ich habe sie nur innerhalb einer Methode hinzugefügt. Dies ist eine vereinfachte Methode. Alle Verwendungszwecke gebenConnectivityManager
true zurück, wenn ein Netzwerkzugriff und kein Internetzugang vorhanden ist. Wenn Ihr WLAN mit einem Router verbunden ist, der Router jedoch kein Internet hat Gibt true zurück und überprüft die Verfügbarkeit der VerbindungZweitens effizienter Weg
Netzwerkstatus und Internetberechtigungen erforderlich
Dann diese Klasse,
Anruf
CheckInternetAsyncTask
Einige Erklärungen :-
Sie müssen das Internet einschalten
AsyncTask
, sonst kann esandroid.os.NetworkOnMainThreadException
in einigen Fällen werfenConnectivityManager
Wird verwendet, um den Netzwerkzugriff zu überprüfen, wenn true eine Anforderung sendet (Ping).Anfrage senden an
http://clients3.google.com/generate_204
, Diese bekannte URL gibt bekanntermaßen eine leere Seite mit einem HTTP-Status zurück. 204 Dies ist schneller und effizienter alshttp://www.google.com
, lesen Sie diese . Wenn Sie eine Website haben, ist es vorzuziehen, Ihre Website anstelle von Google zu platzieren, nur wenn Sie sie in der App verwendenZeitüberschreitung kann Bereich geändert werden (20ms -> 2000ms), 1500ms wird häufig verwendet
quelle
Von allem, was ich bisher gesehen habe, sollte der kürzeste und sauberste Weg sein:
PS: Dies pingt keinen Host an, sondern überprüft nur den Verbindungsstatus. Wenn Ihr Router keine Internetverbindung hat und Ihr Gerät damit verbunden ist, gibt diese Methode true zurück, obwohl Sie kein Internet haben.
Für einen tatsächlichen Test würde ich empfehlen, eine HttpHead-Anfrage (z. B. an www.google.com) auszuführen und den Status zu überprüfen. Wenn 200 OK, ist alles in Ordnung und Ihr Gerät verfügt über eine Internetverbindung.
quelle
Hier ist die Methode, die ich benutze:
Überprüfen Sie noch besser, ob es "verbunden" ist:
So verwenden Sie die Methode:
Erlaubnis erforderlich:
https://stackoverflow.com/a/16124915/950427
quelle
Ein wichtiger Anwendungsfall auf Mobilgeräten, um sicherzustellen, dass eine tatsächliche Verbindung besteht. Dies ist ein häufiges Problem, wenn ein mobiler Benutzer ein Wifi-Netzwerk mit einem "Captive Portal" betritt, in dem er sich anmelden muss. Ich verwende diese Blockierungsfunktion im Hintergrund, um sicherzustellen, dass eine Verbindung besteht.
quelle
Sie können über alle Netzwerkverbindungen iterieren und prüfen, ob mindestens eine Verbindung verfügbar ist:
quelle
Für mich war es keine gute Praxis, den Verbindungsstatus in der Aktivitätsklasse zu überprüfen, weil
sollte dort aufgerufen werden, oder Sie müssen Ihre Aktivitätsinstanz (Kontext) in die Verbindungshandlerklasse verschieben, um dort den Verbindungsstatus überprüfen zu können. Wenn keine Verbindung verfügbar ist (WLAN, Netzwerk), erhalte ich die UnknownHostException- Ausnahme:
Auf diese Weise kann ich diesen Fall zusammen mit den anderen Fällen in derselben Klasse behandeln (mein Server antwortet immer mit einer JSON-Zeichenfolge).
quelle
Es funktioniert bei mir. Versuch es.
quelle
Diese Methode bietet Ihnen die Möglichkeit einer sehr schnellen Methode (für Echtzeit-Feedback) oder einer langsameren Methode (für einmalige Überprüfungen, die Zuverlässigkeit erfordern).
quelle
Ich benutze diesen Code anstelle der InetAddress:
quelle
Es ist nicht komplex, den Status der Android-Netzwerk- / Internetverbindung zu überprüfen. Die folgende
DetectConnection
Klasse hilft Ihnen, diesen Status zu überprüfen:Weitere Informationen finden Sie unter Überprüfen des Android-Netzwerk- / Internetverbindungsstatus
quelle
Bester Ansatz:
quelle
Es folgt der Code aus meiner
Utils
Klasse:quelle
quelle
Mit dieser Methode können Sie die Netzwerkverfügbarkeit ermitteln.
quelle
Ich habe die von @Levit bereitgestellte Lösung angewendet und eine Funktion erstellt, die die zusätzliche HTTP-Anforderung nicht aufruft.
Es wird den Fehler beheben
Unable to Resolve Host
Nennen wir es jetzt wie,
quelle
Dies wird in den Android-Dokumenten http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html behandelt
quelle
Ich habe alle Antworten durchgesehen und mir eine eigene Antwort ausgedacht, die zuerst prüft, ob das Internet verfügbar ist, und ob das Internet verfügbar ist, prüft, ob es aktiv ist oder nicht.
Ich habe alle notwendigen Methoden und Klassen aufgenommen, um nach einer aktiven Internetverbindung zu suchen.
NetworkUtils.class
Sie können überprüfen, ob das Internet aktiv ist, indem Sie den folgenden Code verwenden:
quelle
Es ist sehr wichtig zu überprüfen, ob wir eine Verbindung mit isAvailable () haben und ob es möglich ist, eine Verbindung mit isConnected () herzustellen.
und Sie können die Art von Netzwerk aktiv derterminate WiFi :
oder mobiles Móvil :
Vergessen Sie nicht die Berechtigungen:
quelle
Kotlin und Coroutinen
Ich habe die Funktion in eine platziert
ViewModel
, die die hatviewModelScope
. Mit einem ObservableLiveData
informiere ich eine Aktivität über die Verbindung.ViewModel
Aktivität
quelle
Erstellen Sie einfach die folgende Klasse, die nach einer Internetverbindung sucht:
Diese Klasse enthält einfach eine Methode, die den booleschen Wert des Verbindungsstatus zurückgibt. Wenn die Methode in einfachen Worten eine gültige Verbindung zum Internet findet, lautet der Rückgabewert
true
, andernfalls,false
wenn keine gültige Verbindung gefunden wird.Die folgende Methode in der MainActivity ruft dann das Ergebnis der zuvor beschriebenen Methode auf und fordert den Benutzer auf, entsprechend zu handeln:
Wenn im obigen Code das Ergebnis falsch ist (daher besteht keine Internetverbindung), wird der Benutzer zum Android-WLAN-Bereich weitergeleitet, wo er aufgefordert wird, eine Verbindung zu einem WLAN-Hotspot herzustellen.
quelle
Update 29/06/2015 Wenn Sie Xamarin.Android verwenden und die Konnektivität überprüfen möchten, können Sie ein Nuget-Paket verwenden, das Ihnen diese Funktionalität auf mehreren Plattformen bietet. Gute Kandidaten sind hier und hier . [Ende des Updates]
Die obigen Antworten sind recht gut, aber sie sind alle in Java und fast alle prüfen auf Konnektivität. In meinem Fall musste ich mit einem bestimmten Verbindungstyp verbunden sein und entwickle auf Xamarin.Android. Außerdem übergebe ich keinen Verweis auf meinen Aktivitätskontext in der Hardwareschicht, ich verwende den Anwendungskontext. Hier ist meine Lösung für den Fall, dass jemand mit ähnlichen Anforderungen hierher kommt. Ich habe jedoch noch keine vollständigen Tests durchgeführt. Die Antwort wird aktualisiert, sobald ich mit meinen Tests fertig bin
quelle