Xml-Datei lässt sich nicht immer herunterladen (Android-Studio - Java)

  • 3 Antworten
  • Neuester Beitrag
Diskutiere Xml-Datei lässt sich nicht immer herunterladen (Android-Studio - Java) im Tipps und Anleitungen zur Code-Entwicklung im Bereich Android App Entwicklung.
L

louisbgt

Neues Mitglied
Ich möchte die xml Datei herunterladen, aber es geht nicht immer
Javascript:
package com.udemy.guessthecarbrand;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutionException;

import javax.net.ssl.HttpsURLConnection;

public class MainActivity extends AppCompatActivity {
    // <wird übergeben, nichts wird zurückgegeben>
    public class DownloadTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... urls) {
            String result = "";
            URL url; // initialisieren wir erst später
            HttpsURLConnection urlConnection = null;

            // mehrstufiger Prozess: 1. brauch ich den Link auf den ich verbinden will
            // 2. dann muss ich auf den Link verbinden
            // 3. dann brauch ich ein InputStream, der die Daten in einer bestimmten Form ausliest
            // wir Verbindung/ Kanal, wo die Daten durch gehen
            // 4. muss ich InputStream mit ...Reader auslesen
            // 5. nun können wir daraus Daten machen

            try {
                url = new URL(urls[0]);
                urlConnection = (HttpsURLConnection) url.openConnection();
                InputStream in = urlConnection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);
                int data = reader.read();

                while (data != -1){ //solange nicht minus 1 ist
                    char current = (char) data;  //gib die aktuellen Daten in Buchstaben aus, jedes einzelne Zeichen
                    // befüllen von result
                    // name += ...; heißt wir hängen an
                    result += current;

                    data = reader.read();
                }

                //nach der while-Schleife, sprich nach dem alle Daten ausgelesen wurden
                //geben wir result aus
                return result;


            } catch (MalformedURLException e) {
                e.printStackTrace();
                return "Failed";
            } catch (Exception e) { //alle Probleme
                e.printStackTrace();
                return "Failed";
            }


            // return null; >> brauchen wir nicht mehr, da alle Stränge return zurück geben
            // da oben vor Methodenname String steht
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Klasse aufrufen
        // lege Projekt an und initialisiere es
        DownloadTask task = new DownloadTask();
        String code = null;

        try {
            code = task.execute("https://www.usmagazine.com/celebrities/f/").get();
        } catch (ExecutionException e) { //Verbindung wurde unterbrochen
            e.printStackTrace();
        } catch (InterruptedException e) { //Fehler bei der Ausführung des Ganzen
            e.printStackTrace();
        } catch (Exception e){ // für jede andere Exception, wie z.B. gar kein Internet
            e.printStackTrace();
        }

        Log.i("Result", code);



        //wir brauchen Erlaubnis um aufs Internet zuzugreifen
        // sonst: Logcat > D/NetworkSecurityConfig: No Network Security Config specified, using platform default
        // deshalb: im AndroidManifest.xml
    }
}
wenn ich allerdings die vorherige adresse nehme geht es, bei allen anderen aber nicht, da kommt folgendes:
1610461291304.png
 
J

jogimuc

Stammgast
Hallo
Was soll eigentlich der Aufruf mit dem get?

Code:
code = new DownloadTask().execute("https://www.usmagazine.com/celebrities/f/");
Wenn der Task beendet ist musst du für einen neuen Aufruf einen neuen Thread (Task) also auch ein neues Objekt erstellen.
 
Zuletzt bearbeitet:
L

louisbgt

Neues Mitglied
Was? Ich verstehe kein Wort 😅
 
J

jogimuc

Stammgast
Wenn du nicht weißt was ein neues Objekt ist. Würde ich sagen Grundlagen OOP Programmierung.

Dein Download Objekt task ist nach dem ersten Download nicht mehr gültig.
Neuer Download neues Objekt von deiner Klasse somit auch ein neuer Thread.