Es gibt einige Libraries für Android, die viele aus der weiten Java-Welt bekannten und gewohnten Features in für weniger leistungsfähige Hardware optimierter Version liefern. Da ich einige davon sehr häufig benutze, möchte ich diese heute vorstellen.
Android Annotations (http://androidannotations.org )
Android Annotations liefert eine Unmenge an Features, die diese Library aber nicht unnötig aufblähen, sondern auch tatsächlichen Mehrwert liefern – sprich in so ziemlich jeder App mal benötigt werden. Die Hauptfeatures sind:
- Dependency injection
- Event handling
- Simple threading
- Consuming REST APIs
Android Annotations benutzt APT und Code-Generierung, um zur Compile-Zeit optimierte Klassen zu generieren. Damit gibt es keine Wartezeit beim Start oder langsameres Laufzeitverhalten der App. Es wird relativ einfach über die build.gradle des Projekts/der App eingebunden:
1buildscript { 2 // … 3 dependencies { 4 classpath 'com.android.tools.build:gradle:2.2.3' 5 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 6 } 7 // … 8}
build.gradle (Projekt)
1apply plugin: 'android-apt' 2 3android { 4 // … 5} 6 7dependencies { 8 // … 9 apt('org.androidannotations:androidannotations:4.2.0') 10 compile('org.androidannotations:androidannotations-api:4.2.0') 11}
build.gradle (App)
Der größte Mehrwert entsteht durch den sehr viel saubereren Code.
1public class ExampleActivity extends Activity {
2 private Button exampleButton;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.layout_example);
8 exampleButton = (Button) findViewById(R.id.exampleButton);
9 exampleButton.setOnClickListener(new OnClickListener() {
10 @Override
11
public void onClick(View view) {
12
// do something
13
}
14 });
15 }
16}
Vanilla Android
1@EActivity(R.layout.layout_example);
2public class ExampleActivity extends Activity {
3 @ViewById
4 Button exampleButton;
5
6 @Click
7 void exampleButtonWasClicked() {
8 // do something
9 }
10}
Android mit Android Annotations
Wem Android Annotations zuviel bietet, kann z.B. eine Kombination aus Butterknife (view injection, Link ), Dagger (dependency injection, Link ) und Retrofit (REST client, Link ) nutzen.
EventBus (http://greenrobot.org/eventbus )
Um die Activity oder ein Fragment von der Geschäftslogik abzukoppeln, kann sich der Einsatz des Publish/Subscribe-Patterns lohnen. Eine etablierte Bibliothek ist der EventBus von greenrobot:
1apply plugin: 'android-apt' 2 3android { 4 // … 5} 6 7dependencies { 8 // … 9 compile('org.greenrobot:eventbus:3.0.0') 10}
build.gradle (App)
1public class ExampleActivity extends Activity {
2 protected final EventBus eventBus = EventBus.getDefault();
3
4 @Override
5 protected void onStart() {
6 super.onStart();
7 eventBus.register(this);
8 }
9
10 @Override
11 protected void onStop() {
12 super.onStop();
13 eventBus.unregister(this);
14 }
15}
IcePick (https://github.com/frankiesardo/icepick )
IcePick reduziert ebenfalls durch APT und Code-Generierung den Boilerplate, der durch das Verwalten der Instanzdaten von Activities oder Fragments entsteht.
1@EActivity(R.layout.layout_example);
2public class ExampleActivity extends Activity {
3
4 @State
5 String exampleText;
6
7 @ViewById
8 Button exampleButton;
9
10 @Click
11 void exampleButtonWasClicked() {
12 // do something
13 }
14
15 @Override
16 protected void onSaveInstanceState(Bundle outState) {
17
super.onSaveInstanceState(outState);
18 Icepick.saveInstanceState(this, outState);
19
}
20
21 @Override
22
protected void onRestoreInstanceState(Bundle savedInstanceState) {
23
super.onRestoreInstanceState(savedInstanceState);
24
Icepick.restoreInstanceState(this, savedInstanceState);
25 }
26}
Der Inhalt von exampleText wird nun bei allen Konfigurationsänderungen (z.B. OrientationChanges) wiederhergestellt.
LeakCanary (https://github.com/square/leakcanary )
Memory Leaks sind kein Kavaliersdelikt! Um diese überhaupt finden zu können, kann LeakCanary eingesetzt werden. Einmal in der Application-Implementierung der App instanziert, zeigt es beim Testen des Debug-Builds der App eine Notification an, sobald ein Memory Leak erkannt werden konnte:
1public class ExampleApplication extends Application {
2
3 @Override
4 public void onCreate() {
5 super.onCreate();
6 if (LeakCanary.isInAnalyzerProcess(this)) {
7 // This process is dedicated to LeakCanary for heap analysis.
8 // You should not init your app in this process.
9 return;
10 }
11 LeakCanary.install(this);
12 }
13}
Espresso (https://developer.android.com/topic/libraries/testing-support-library/index.html#Espresso )
Espresso ist ein in den Android Test Support Libraries enthaltenes Test-Framework, das eine DSL für automatisierte UI-Tests anbietet. Für die meisten Entwickler sind die implementierten Konzepte (JUnit, JUnit-TestRules, Matchers) nicht neu, daher ist dieses Framework einfach zu erlernen. Espresso läuft auf Emulatoren und echten Devices.
Unter dem Strich…
… ist dies nur eine kleine, ausgewählte Liste von Bibliotheken, die sich auf (Code-)Qualität, Wartbarkeit und Testbarkeit auswirken. Einige der kleinen Ecken und Kanten, die die Entwicklung von Apps für Android erschweren und viel Zeit verschlingen, werden hiermit ausgebügelt. Ein Hoch auf die Community!
Welche Libraries benutzt ihr gerne? Hinterlasst gerne einen Kommentar und diskutiert mit mir.
Weitere Beiträge
von Sascha Masanneck
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Sascha Masanneck
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.