Meiner Meinung nach ist die UI das Wichtigste an einer Anwendung, aber auch die beste und schönste UI brauch irgendwann einmal Daten und diese kommen zu 90% aus dem Internet. Egal ob Twitter, Youtube oder irgendein RSS-Feed – die Datenstrukturen müssen heruntergeladen, geparst und weiterverarbeitet werden. Den ersten Schritt „Das Downloaden“ beschreibe ich in diesen Beitrag.
In Android respektiv Java gibt es verschiedene Möglichkeiten Dateien aus dem Internet herunterzuladen. Eine Möglichkeit davon, die in beiden Welten funktioniert, ist die Klasse HttpURLConnection.
/** Downloadet eine Datei aus dem Internet * @param urlStr URL-Adresse (bsp. http://blog.axxg.de/index.php) * @return HTML Dokument, Bitmap, etc. * @throws Exception (bsp. FileNotFoundException, wenn keine Verbindung moeglich ist) */ public String sendRequest(String urlStr) throws Exception{ // Standardvalidierung if(urlStr == null || urlStr.isEmpty()){ throw new InvalidParameterException("Der Parameter urlStr ist null oder leer!"); } // Verbindung erstellen HttpURLConnection connection = null; // hier kann eine Exception fliegen, wenn es keine URL ist URL url = new URL(urlStr); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.setUseCaches(false); // Antwort erstellen StringBuilder str = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = ""; while ((line = br.readLine()) != null) { str.append(line + System.getProperty("line.separator")); } // Antwort wieder geben return str.toString(); }
In Android ist es verboten Netzwerkaktivitäten im UI-Thread/Main-Thread durchzuführen, da sonst die UI einfriert/nicht mehr reagiert. Daher muss man z.B. ein AsyncTask verwenden.
package de.axxg.std; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.security.InvalidParameterException; import android.os.AsyncTask; import android.util.Log; public class TestAT extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { try { String html = null; // unsere Methode aufrufen html = sendRequest(params[0]); Log.d(this.getClass().getName(), html); // ggf weiterverarbeiten!!!!! parsen, Datenbank updaten, etc. // oder zurueckgeben return html; } catch (Exception e) { Log.e(this.getClass().getName(), "Fehler in der SST", e); } return null; } /** Downloadet eine Datei aus dem Internet * @param urlStr URL-Adresse (bsp. http://blog.axxg.de/index.php) * @return HTML Dokument, Bitmap, etc. * @throws Exception (bsp. FileNotFoundException, wenn keine Verbindung moeglich ist) */ public String sendRequest(String urlStr) throws Exception { // Standardvalidierung if (urlStr == null || urlStr.isEmpty()) { throw new InvalidParameterException("Der Parameter urlStr ist null oder leer!"); } // Verbindung erstellen HttpURLConnection connection = null; // hier kann eine Exception fliegen, wenn es keine URL ist URL url = new URL(urlStr); connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.setUseCaches(false); // Antwort erstellen StringBuilder str = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = ""; while ((line = br.readLine()) != null) { str.append(line + System.getProperty("line.separator")); } // Antwort wieder geben return str.toString(); } }
Der Aufruf des AsyncTasks geht ganz einfach:
TestAT task = new TestAT(); task.execute("http://blog.axxg.de/index.php");
Bitte nicht die entsprechende Berechtigung in der AndroidManifest.xml vergessen!
<uses-permission android:name="android.permission.INTERNET"/>
Copyright © 2014 AxxG – Alexander Gräsel
Hi,
vielen Dank für das tolle Tutorial!
Ich habe folgendes vor.
Mittels sendRequest wird eine .txt aus dem Internet geladen und soll nun geparst werden. Diese Strings möchte ich gerne in der MainActivity verwenden. Jedoch bekomme ich beim Aufruf aus der MainActivity immer eine NullPointerException. Gibt es einen Idealweg um diese Sachen zu bearbeiten?