URL erreichbarkeit prüfen

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.


Java:
  // 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

Top Contributor
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

Top Contributor
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

Top Contributor
PS: Toast einfach mit runOnUiThread als Lambda

Java:
runOnUiThread( () ->
     {Toast.makeText(getApplicationContext(),"URL erreichbar",Toast.LENGTH_LONG).show();
     });
 
@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.


Java:
// 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();
 
K

kneitzel

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

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.
 

Oben