Asynctask zum Überprüfen ob Internet verfügbar ist

L

Lainio

Ambitioniertes Mitglied
3
Hallo Leute,

ich habe folgende Klasse:

PHP:
public class NetworkAvailability extends AsyncTask<Context, Boolean, Boolean> {

    Context mContext;

    /*------------------------Prüfen ob Internet verfügbar----------------------*/
    private static boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) ListViewActivity.getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting()) {
            Log.i("Netzwerkstatus: ", "Netzwerk-Verbindung verfügbar");
            return true;
        }
        return false;

    }

public NetworkAvailability(Context mContext) {
        this.mContext = mContext;
    }

    public NetworkAvailability() {
    }

    @Override
    protected Boolean doInBackground(Context... params) {
        if (isNetworkAvailable()) {
            try {
                HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.de").openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(1500);
                try {
                    urlc.connect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //i ist 200 bei Internetverbindung
                int i = urlc.getResponseCode();
                return (i == 200);
            } catch (IOException e) {
                Log.e("IsInternetAccessible: ", "Konnte Internetverbindung nicht prüfen");
            }
        } else {
            Log.d("IsInternetAccessible:", "Internet nicht verfügbar");
        }
        return false;
    }

}

Diese Klasse soll überprüfen ob eine Internetverbindung vorhanden ist und ob ich Zugriff auf das Internet habe.

Diese Klasse soll an verschiedenen Stellen verwendet werden, um Abstürze wegen fehlender Internet-Verbindung, zu vermeiden.

Jedoch weiß ich nicht wie ich diese richtig verwenden kann.

Ein Beispiel:

PHP:
            if (networkAvailability.execute()) {
                XMLParser parser = new XMLParser();
                String xml = parser.getXMLFromUrl("http://XXXXX/XX.xml");
                Document doc = parser.getDomElement(xml);

                NodeList nl = doc.getElementsByTagName(KEY_SYSTEM);

                for (int i = 0; i < nl.getLength(); i++) {

                    // Neue HashMap erstellen
                    HashMap<String, String> map = new HashMap<String, String>();
                    Element e = (Element) nl.item(i);

                    // Jedes Kind-Knoten zur HashMap
                    map.put(KEY_UUID, parser.getValue(e, KEY_UUID));
                    map.put(KEY_NAME, parser.getValue(e, KEY_NAME));
                    map.put(KEY_JOBTITLE, parser.getValue(e, KEY_JOBTITLE));
                    map.put(KEY_JOBINFO, parser.getValue(e, KEY_JOBINFO));
                    map.put(KEY_IMAGE, parser.getValue(e, KEY_IMAGE));

                    //Hashmap zur ArrayList hinzufügen
                    menuItems.add(map);
                }
            } else {
                Log.i("doInBackground:", "Keine Internet-Verbindung");
                return null;
            }

Das networkAvailability.execute() funktioniert soweit auch nicht weil in der Bedingung von if natürlich boolean sein muss.

Kann mir da einer helfen?

wenn ich nach dem .execute() ein .get() reinsetze dann friert das Interface ein. Sollte also keine Lösung sein.

Ich hoffe ihr könnt mir helfen!!


Vielen Dank!!

lg
lainio
 
AsyncTask<>.execute() startet den Prozess in den Hintergrund, das Ergebnis steht dann noch lange nicht fest.

Also kannst du mit der Antwort noch nicht arbeiten und musst deinen HTTP Request später (in einem anderen AsyncTask - denn sowas ist ja im UI Thread nicht erlaubt) starten.

Also musst du entweder den Code mit in den AsyncTask hineintun, in ersterem im onPostExecute einen weiteren starten (etwas unschön) oder der Download vom ersteren erben lassen und geeignet erweitern (schöner).
 
Ich finde den Ansatz etwas unnötig. Wenn du an einem Ort prüfst, ob eine Webseite erreichbar ist, garantiert dir das nicht, dass die Verbindung auch im nachfolgenden Code-Block (innerhalb deiner if-Bedingung) noch vorhanden / stabil ist. Du verringerst zwar die Wahrscheinlichkeit, dass etwas schiefgeht, aber löst das Problem nicht.

Ich würde einfach nur prüfen, ob du mit einem Netzwerk connected bist. Falls ja, versuchst du, den Download durchzuführen und falls das schiefgeht, behandelst du den Fall sauber mittels Exceptions.

Dann kommst du auch nicht in die Probleme, die dein asynchroner Check mit sich bringt (wie du ja bereits gemerkt hast und DieGoldeneMitte auch beschrieben hat)
 
Zuletzt bearbeitet:

Ähnliche Themen

U
  • unerfahrenerAppEntwickler
Antworten
3
Aufrufe
706
swa00
swa00
wernho
Antworten
11
Aufrufe
692
wernho
wernho
Zurück
Oben Unten