URL check mit SDK 2.3.1 oder höher

  • Antworten:6
MB Power
  • Forum-Beiträge: 28

19.06.2011, 11:38:08 via Website

Kann mir jemand sagen warum ab der SDK 2.3.1 der folgenden Code nicht mehr funktioniert und was für eine Alternative es gib?
http://www.test.de/test.php existiert nicht und ist nur als Beispiel gedacht. Bis zu Version 2.2 gibt es keine Probleme.
Wäre für jede Hilfe sehr dankbar.

1if (existsURL("http://www.test.de/test.php")) {
2 AlertDialog ("Ja");
3} else {
4 AlertDialog ("Nein");
5}

1public static boolean existsURL(String URLName){
2try {
3 HttpURLConnection.setFollowRedirects(false);
4 // note : you may also need
5 // HttpURLConnection.setInstanceFollowRedirects(false)
6 HttpURLConnection con =
7 (HttpURLConnection) new URL(URLName).openConnection();
8 con.setRequestMethod("HEAD");
9 return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
10}
11catch (Exception e) {
12 e.printStackTrace();
13 return false;
14}
15}

Antworten
Markus B.
  • Forum-Beiträge: 636

19.06.2011, 15:23:43 via Website

Hi,
also ich habe deinen Code nun unter 2.2 / 2.3 / 2.3.3 ausprobiert und dieser läuft wunderbar. Ein SDK 2.3.1 bietet der SDK Manager zudem gar nicht zum downloaden an. Wie bist du denn daran bekommen?
Was bekommst du denn genau für eine Fehlermeldung ?

Gruß,
Markus

Antworten
MB Power
  • Forum-Beiträge: 28

19.06.2011, 17:28:47 via Website

Wie kann das bei Dir funktionieren?

Kannst Du bitte das folgende Projekt testen.
https://rapidshare.com/files/3114375317/Test.zip

Bei mir funktioniert das Projekt Test leider nur bis Version 2.2. Ein Fehlermeldung bekomme ich im LogCat leider nicht, aber da mache ich ganz sicher was falsch.

Im Android SDK und AVD Manager kann ich auch Android 2.3.1 - API Level 9 auswählen.

Antworten
Markus B.
  • Forum-Beiträge: 636

19.06.2011, 18:07:04 via Website

Hi,
ich habe im SDK Manager einfach das "revision 1" überlesen ...
So nun zu deinem Problem:
Also ich kann das Problem nun auch nachvollziehen. Warum HttpUrlConnection unter 2.3.1 solange braucht um eine TimeoutException zu schmeißen weiß ich nicht. Laut der API hat sich zwischen API-Level 8 und 9 dort auch nichts geändert. Es sind unter Level 9 "nur" einige neue Klassen hinzugekommen. Du kannst den Fehler umgehen indem du con.setReadTimeout() setzt.
Nun zu dem Fehler ANR :
Hier hast du eine schwäche in deiner Planung. Du fragst beim Klicken auf dem Menü ab, ob die Seite www.test.com vorhanden ist. Hier braucht die Anfrage unter 2.3.1 einfach länger (warum auch immer). Das sorgt nun dafür das der GUI-Thread zulange hängt und der Android Guardian schießt deine Anwendung ab. Du musst solche Geschichten Async zum GUI Thread erledigen.

Gruß,
Markus

Markus Gu

Antworten
MB Power
  • Forum-Beiträge: 28

19.06.2011, 18:42:38 via Website

Hallo Markus
Danke für Deine Hilfe, aber leider komme ich nicht ganz klar damit.
Welchen Fehler kann ich mit dem Timeout umgehen? Es wird dann doch nur die Anfrage angebrochen und mir dann "Fehler" zurückgegeben. obwohl die Seite im Internet vorhanden ist.

Gibt es vielleicht eine andere "einfache" Möglichkeit zu prüfen, ob eine Seite im Internet vorhanden ist.

— geändert am 19.06.2011, 18:44:26

Antworten
Markus B.
  • Forum-Beiträge: 636

19.06.2011, 19:28:59 via Website

Hi,
also wenn ich deine Test-App in einem 2.3.1 Emulator ausführen willst, bekomme ich einen ANR. Somit geht dort bei mir gar nichts mehr und die Anwendung beendet sich. Hast du an dieser Stelle eine anderes Verhalten ?
Zum Thema Website prüfen:
So wie du es aktuell machst ist es für deine Zwecke okay. Nur muss du darauf achten das du nicht nur "HttpURLConnection.HTTP_OK" abfragst, das z.B. die Http-Status-Code 301 / 302 sind auch okay und stehen für einen Redirect.

Gruß,
Markus

Antworten
MB Power
  • Forum-Beiträge: 28

20.06.2011, 14:36:43 via Website

Hier eine einfache URL Check-Lösung, die auch unter 2.31 oder höher funktioniert.

1public static boolean existsURL(String urlString){
2 InputStream is = null;
3 try {
4 URL url = new URL(urlString);
5 URLConnection con = url.openConnection();
6
7 is = con.getInputStream();
8 return true;
9 } catch (Exception e) {
10 return false;
11 }finally{
12 if(is!= null)
13 try {is.close();} catch (IOException e){ }
14 }
15}

Antworten