Android/Java – InetAdress.isReachable – Timeout unzuverlässig. Alternative?

Bei mir zumindest 🙂 Ich wollte die o.g. Methode nutzen, um zu überprüfen, ob mein NAS hochgefahren ist. Die Timeouts wollte ich variabel halten, so dass der User diese als Parameter einstellen kann. Allerdings stellte sich in meinen Tests heraus, dass der Timeout wohl ein Maximum hat. Egal welchen Wert (z.B. 600000 ms = 10 min.) ich mitgab, die Methode endete nach ~ 3 Minuten 15 Sekunden. Das wollte ich so nicht verwenden. Auf meine Anfrage bei Stackoverflow gab es jedoch keine Antwort. Also mit einem maximalen Timeout von 3 Minuten leben, nicht schön, aber ok, was solls. App fertig gepackt, aufs Nexus One geschoben und getestet. Aber Pustekuchen…isReachable liefert direkt false zurück. Hmm…aber wenn das System erreichbar ist, dann funktioniert es.

Also weiter gesucht und ich dachte ich habe genau dort die Lösung gefunden. Problem hier: Auch hier funktioniert Timout nicht wie gewünscht.

Also die Erkenntnis aus der ersten Methode mit etwas “Eigenkreativität” kombiniert und herausgekommen ist folgendes:

while (!reachable && !timeoutReached){
reachable = InetAddress.getByName(params[0]).isReachable(1000);
Thread.sleep(10000);
timeout-=10000;
if (timeout< =0){ timeoutReached = true; } }

Timeout wird hier aus den Preferences ausgelesen. Sobald der Rechner erreichbar ist oder die Timeoutzeit erreicht wird, ist der Schleifendurchlauf beendet.
Sicher nicht der eleganteste und genauste Weg (>Für Anmerkungen bin ich offen), aber es funktioniert.

Dieses kleine Problemchen hat mich jetzt die letzte Woche beschäftigt, vor allem die Tests sind immer sehr mühselig. Mein NAS musste ganz schön leiden (hochfahren/-runterfahren). So, wenn alles gut geht und die Tests morgen und übermorgen nicht noch die ein oder andere Überraschung mitbringen, dann stehen die Chance für ein Update am Sonntag oder Montag doch sehr gut 🙂

Leave a Reply