| Kommentare

AndroidAnnotations

Endlich stressfrei Android Apps entwickeln

AndroidAnnotations vereinfacht das Entwickeln von Android Apps, oder: Das Problem mit dem Boilerplate-Code.

Das Entwickeln von Android Apps ging schon immer mit dem Schreiben von viel Boilerplate-Code einher. Threads, Event-Listener und der Zugriff auf Views über deren ID sind hier die Begriffe, die jeden Entwickler bei seinem kreativen Prozess behindern. Aufgaben asynchron abarbeiten, unzählige findViewById() Aufrufe und die Zuweisung von Event-Listenern blähen den eigentlich wichtigen Quellcode unnötig auf und lenken von den wichtigen Aufgaben ab.

Das dachten sich wohl auch die Entwickler von AndroidAnnotations, die 2010 anfingen an dieser Bibliothek zu arbeiten. Unter dem Motto “Fast Android Development. Easy maintainance.” ist diese Bibliothek in den letzten 3 Jahren zu einer beachtlichen Größe herangewachsen und hilft unseren Laboringenieuren bei ihrer täglichen Arbeit. Durch die Reduzierung der Lines of Code um bis zu 50%, können wir die Zutaten noch schneller zu großartigen Produkten vermischen, und diese dann auch besser warten.

Aber wie funktioniert das Ganze? Dazu schauen wir uns eine kleine Beispiel-App (Github) an, die als Ziel hat, die Kreiszahl Pi mithilfe der Monte-Carlo Methode zu berechnen. Die Berechnung dauert je nach Anzahl der Iterationen eine gewisse Zeit und das User Interface soll währenddessen weiterhin auf Eingaben reagieren. Das User Interface besteht dabei aus einer ListView und einem Button.

Nachdem die beiden JAR-Dateien der Bibliothek im Reagenzglas sind, kann die Haupt-Activity erstellt werden. Über die Deklaration schreiben wir die Annotation @EActivity.

1
2
3
4
@EActivity
public class MainActivity extends Activity {
...
}

Damit legen wir fest, dass in dieser Activity AndroidAnnotations genutzt wird. Die oben erwähnten Views müssen nun nicht mehr über den findViewById() Aufruf zugewiesen werden, sondern werden einfach per Annotation eingefügt. Die ID der View, welche dann zugewiesen wird, richtet sich nach dem Variablennamen. Im folgenden Beispiel hat also die ListView die ID R.id.listViewResults. Alternativ kann die ID auch manuell festgelegt werden, wie beim Button zu sehen ist.

1
2
3
4
5
@ViewById
ListView listViewResults;

@ViewById(R.id.btCalculate)
Button btCalculate;

Auch View Listener können per Annotation hinzugefügt werden. Die Methode buttonClick() wird also ausgeführt, wenn der Button mit der ID R.id.btCalculate geklickt wird.

1
2
3
4
5
@Click(R.id.btCalculate)
void buttonClick() {
    setProgressBarIndeterminateVisibility(true);
    calculatePi();
}

Ein Ziel dieser Applikation war es, dass das User Interface während der Berechnung von Pi weiterhin auf Nutzereingaben reagiert. Daher muss die Berechnung in einem separaten Thread ausgeführt werden. Auch hier hilft AndroidAnnotations uns Laboringenieuren weiter.

1
2
3
4
5
6
7
@Background
void calculatePi() {
    for (int i = 100000; i <= 500000; i+=10000) {
        Result result = Pi.calcPi(i);
        showResult(result);
    }
}

Ein einfaches @Background über dem Methodennamen führt dazu, dass diese Methode in einem eigenen Thread ausgeführt und das User Interface nicht blockiert wird. Um aus einem Thread heraus wieder auf das User Interface zugreifen zu können, muss man nicht mehr den umständlichen Weg über Handler gehen, sondern einfach eine zweite Methode mit der Annotation @UiThread erstellen.

1
2
3
4
@UiThread
void showResult(Result result) {
    ...
}

Damit die optimierte Activity nun auch gestartet werden kann, muss sie der AndroidManifest.xml bekannt gemacht werden. Üblicherweise gibt man dort genau den Klassennamen, also in unserem Fall MainActivity, an. Nutzt man allerdings AndroidAnnotations, muss an den Klassennamen noch ein “_” gehangen werden. Wir schreiben also

android:name="com.example.pi.after.MainActivity_"

anstatt

android:name="com.example.pi.after.MainActivity"

Im Beispielprojekt, welches in unserem öffentlichen Labor-Git verfügbar ist, konnte so die Anzahl der Lines of Code schon um mehr als ein Viertel reduziert werden, und hier wurden die Möglichkeiten von AndroidAnnotations noch nicht ansatzweise ausgeschöpft. Es ist eine wirklich großartige Bibliothek, die unseren Laboringenieuren die Arbeit ungemein erleichtert. Wir sind gespannt wie es weiter geht und freuen uns auf neue Versionen dieser tollen Zutat.

Comments