# URL erreichbarkeit prüfen



## TheWalkingFrame (4. Sep 2021)

Ich habe in meiner Activity ein Textview Feld, welches den Inhalt einer .txt Datei auf einem FTP-Server abruft und anzeigt. Dies funktioniert wunderbar. Wenn der FTP-Server oder die .txt Datei nicht erreichbar ist, soll in die MainActivity zurückgewechselt werden und eine Toast ausgabe erfolgen. 

Ich habe es mit connection.getResponseCode() versucht, jedoch tut sich da nichts. Die App stürzt nach dem Timeout ab.

Vielleicht kann mir da freundlicherweise jemand weiterhelfen.



```
// TEXTVIEW READ FROM URL DATA.TXT
            new Thread(new Runnable() {

                public void run() {

                    ArrayList<String> urls = new ArrayList<String>();


                    try {
                        URL url = new URL("http://URL/data.txt"); //Textfile Location
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.setConnectTimeout(60000);
                        connection.setRequestMethod("GET");
                      
                        int responseCode = connection.getResponseCode();

                        if (responseCode == 200) {
                            
                            Toast.makeText(SecondActivity.this,"URL erreichbar",Toast.LENGTH_LONG).show();
                        
                        }else{
                            
                            Toast.makeText(SecondActivity.this,"URL nicht erreichbar",Toast.LENGTH_SHORT).show();
                            Intent back= new Intent(SecondActivity.this, MainActivity.class);
                            startActivity(back);
                        }

                        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                        String str;
                        while ((str = in.readLine()) != null) {
                            urls.add(str);
                        }
                        in.close();

                    } catch (Exception e) {
                        Log.d("MyTag", e.toString());
                    }

                    SecondActivity.this.runOnUiThread(new Runnable() {
                        public void run() {
                            t.setText(urls.get(0));
                        }
                    });
                }
            }).start();
```


----------



## Robert Zenz (4. Sep 2021)

TheWalkingFrame hat gesagt.:


> Die App stürzt nach dem Timeout ab.


Ich behaupte, dass nach dem Timeout eine Exception fliegt, welche du weg ignorierst (die Log-Zeile mit "MyTag"
), und dann "urls" leer ist und deswegen dort eine weitere Exception fliegt, und deswegen die App beendet wird.

Also was du aendern musst ist einmal dein Code im Hauptthread, du musst dort pruefen ob "urls" leer ist bevor du darauf zugreifst...oder halt das es nicht leer ist. Und dann musst du schauen wieso die URL nicht erreichbar war (geraten: Es gibt keine HTTP-Schnittstelle auf dem Server).


----------



## Jw456 (5. Sep 2021)

Das deine App abstürzt liegt an dem Toast im dem Thread. In einem Thread kannst du keine Bildschirm ausgaben machen das betritt auch den Toast.

Bei deiner Textview machst du es ja richtig im UI Thread


----------



## Jw456 (5. Sep 2021)

PS:  Toast einfach mit runOnUiThread als Lambda


```
runOnUiThread( () ->
     {Toast.makeText(getApplicationContext(),"URL erreichbar",Toast.LENGTH_LONG).show();
     });
```


----------



## TheWalkingFrame (5. Sep 2021)

@Robert Danke für die Info. Ich bin noch ziemlich am Anfang und habe mich da ein wenig falsch ausgedrückt. Habe testweise das Timeout rausgenommen damit keine Exception fliegt. Ich habe diese .txt Datei auf meinem Raspberry Pi somit kann ich gut simulieren, dass die Datei nicht erreichbar ist wenn ich ihm aus dem Netzwerk nehme.

@Jw456 Vielen Dank für den Tipp! Ich habe das nun versucht und habe jetzt folgendes Problem.  Er wirft mir nun die Toast Meldung korrekt aus wenn der Server erreichbar ist. Ich möchte jedoch, dass er eine Toast Meldung ausgibt wenn der Server NICHT erreichbar ist und da passiert leider garnichts. Ich habe es auch bereits mit anderen responseCodes probiert aber sobald der Server weg vom Netzt ist gibt er mir gar keine Toast meldung aus.



```
// TEXTVIEW READ FROM URL DATA.TXT
            new Thread(new Runnable() {

                public void run() {

                    ArrayList<String> urls = new ArrayList<String>();

                    try {
                        URL url = new URL("http://myurl/data.txt");
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");

                        int code = connection.getResponseCode();

                        if (code == 200) {
                            
                            runOnUiThread(() ->
                            {
                                Toast.makeText(getApplicationContext(), "URL erreichbar", Toast.LENGTH_LONG).show();
                            });
                            
                        }else{

                            runOnUiThread(() ->
                            {
                                Toast.makeText(getApplicationContext(), "URL nicht erreichbar", Toast.LENGTH_LONG).show();
                            });
                        }
                        
                        BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        String str;
                        while ((str = in.readLine()) != null) {
                            Log.i("data", str);
                            urls.add(str);
                        }

                        in.close();

                        PDF_MainActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                t.setText(urls.get(0));
                            }
                        });
                        
                    } catch (IOException e) {
                        Log.d("MyTag", e.toString());
                    }
                }
            }).start();
```


----------



## kneitzel (5. Sep 2021)

Also das getResponseCode wirft eine IOException, wenn der Server nicht erreichbar ist:




__





						HttpURLConnection (Java Platform SE 8 )
					





					docs.oracle.com
				




Daher fuktioniert das mit dem if / else nicht sondern Du bekommst die Exception, die Du nur mit MyTag ins Log schreibst. Du musst also die IOException vom getResponseCode abfangen und da dann den toast erstellen.


----------



## TheWalkingFrame (5. Sep 2021)

@kneitzel Vielen Dank für den Hinweis. Habe es nun hinbekommen und funktioniert wunderbar. Da habe ich wieder etwas dazugelernt.

Vielen Dank für eure Hilfe !


----------

