Android Programmierung: AsyncTask mit ProgressDialog (Lösung mit einem Callback)

In diesem Tutorial möchte ich beschreiben wie man eine asynchrone Aufgabe auslagert und parallel dazu einen Dialog anzeigt. Den ProgressDialog habe ich bereits im Tutorial Android, ProgressDialog für lange Operationen erläutert.

Es gibt bereits einige Beispiele dazu im Internet und die Lösungen sind zumeist praktikabel und funktionell. Jedoch sind diese zumeist mit einer inneren Klasse (wie in der offiziellen Dokumentation https://developer.android.com/reference/android/os/AsyncTask) und blähen dadurch den Quellcode unnötig auf. Ich möchte gerne einen anderen Weg gehen und den AsyncTask auslagern und mit einem Callback versehen so halten wir unseren Quellcode schlank und haben immer das Wesentliche im blick.

Projekt erstellen

Für die nachfolgenden Schritte benötigen wir ein einfaches, leeres Android Projekt mit einer Activity (EmptyActivity). 

Gerne möchte ich dir der einfachheithalber ein Download für ein Projekt anbieten welches du dir in Android Studio importieren kannst.

 

Layout erstellen

Für das Ausführen des asynchronen Task benötigen wir eine Schaltfläche und für die Anzeige der Daten  TextView Elemente. Diese Elemente fügen wir über den Designer auf das Layout „activity_main.xml“.

Interface ICallback erzeugen

Für die Verarbeitung des Ergebnisses unseres asynchronen Tasks benötigen wir ein Interfaces. Dieses ermöglicht es uns späterer mehrere Implementationen für eventuelle verschiedene Ausführungen zu implementieren.

Nun müssen wir uns eine innere Klasse schreiben welche das Interface „ICallback“ implementiert. Mit dem implementieren des Interfaces müssen wir zusätzlich die Methode „handleResult“ implementieren.

asynchronen Task erstellen

Nun können wir uns eine öffentliche Klasse für den asynchronen Task erstellen welchen wir mit der Schaltfläche starten wollen.

In diesem Beispiel möchte ich eine einfache Datei aus dem Internet laden. Da ich in diesem Tutorial beschreiben möchte wie ein asynchroner Task mit einem Callback ausgestattet werden kann überspringe ich die Erläuterungen für das herunterladen von Dateien.

In dem Kontruktors des asynchronen Task wird der Context und zusätzlich ein Callback übergeben.

Für dieses Beispiel habe ich eine Datei mit ca. 30MB auf eine Subdomain (http://progs.draeger-it.blog/example.file) geladen. Ich kann & möchte nicht garantieren das diese Datei auf ewig bereitgestellt wird. Die Datei selbst habe ich mit dem Befehl „fsutil file createnew example.file 3000000“ unter Microsoft Windows 10 erstellt.

ProgressDialog - Download im Vorgang
ProgressDialog – Download im Vorgang

Wichtig ist hier die Methode „onPostExecute“, diese Methode wird zum Schluss ausgeführt und in diesem Beispiel werde ich hier den Callback aufrufen.

Ausführen des asynchronen Task

Für das Ausführen des asynchronen Task haben wir im ersten Schritt eine Schaltfläche erzeugt. Nun wollen wir an diese Schaltfläche einen Listener hängen und in diesem den Task starten.

Nun müssen wir noch ein Callback implementieren. In diesem Callback werde ich 2 Textfelder (jeweils mit Dateiname, Dateigröße) und / oder ein Feld mit der Fehlermeldung einer Exception befüllen.

Download

Fazit

Das auslagern des asynchronen Task hat mir geholfen ein bereits bestehendes Projekt deutlich zu verschlanken. Man könnte nun statt einem Callback auch ein funktionales Interface nutzen jedoch geht dieses erst ab Java 8. 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.