Android: Einfacher Datei-Download per HttpURLConnection

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.

 

HttpURLConnection

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();
	}

 

Beispielverwendung

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



1 Antwort : “Android: Einfacher Datei-Download per HttpURLConnection”

  1. julianpe sagt:

    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?

Kommentar verfassen