Dependency Injection für Android

RoboGuice

Am deutlichsten wird die Ausrichtung von RoboGuice [5], aktuell in der Version 1.1.2, durch ein Zitat aus dem zugehörigen Wiki: „RoboGuice’s goal is to make your code be about your app, rather than be about all the initialization and lifecycle code you typically have to maintain in Android“. Das auf Google Guice (ohne AOP) basierende Framework setzt damit genau an der Stelle an, die den meisten Java-Entwicklern bei der Implementierung von Android-Anwendungen ein echter Dorn im Auge ist: am schier unendlichen Initialisierungs- und Lifecycle-Code. Nahezu alle Android-Komponenten und -Ressourcen lassen sich mit RoboGuice über entsprechende Annotationen injizieren. In der Regel werden dazu injectable-Proxies verwendet, die eigene Callback-Methoden zur Verfügung stellen. Der Vorteil wird bereits an einem kleinen Beispiel (leicht modifiziert aus [4] entnommen) deutlich. Während Listing 1 den klassischen Android-Code einer Activity zeigt, finden wir in Listing2 den gleichen Code unter Verwendung von RoboGuice und der dort enthaltenen RoboActivity.

Listing 1: klassischer Android-Code
class AndroidWay extends Activity { 
  
  TextView name; 
  ImageView thumbnail; 
  LocationManager loc; 
  Drawable icon; 
  String myName; 

 public void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState); 
   setContentView(R.layout.main);
   name = (TextView) findViewById(R.id.name); 
   thumbnail = (ImageView) findViewById(R.id.thumbnail); 
   loc = (LocationManager)getSystemService(Activity.LOCATION_SERVICE); 
   icon = getResources().getDrawable(R.drawable.icon); 
   myName = getString(R.string.app_name); 
   name.setText( "Hello, " + myName ); 
  } 
}
Listing 2: RoboGuice-Android-Code
@ContentView(R.layout.main)
class RoboWay extends RoboActivity { 

  @InjectView(R.id.name) TextView name; 
  @InjectView(R.id.thumbnail) ImageView thumbnail; 
  @InjectResource(R.drawable.icon) Drawable icon; 
  @InjectResource(R.string.app_name) String myName; 
  @Inject LocationManager loc; 

  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);
    name.setText( "Hello, " + myName ); 
  } 
}

Ganz nebenbei bietet RoboGuice auch noch das ein oder andere „Nice to have“. Mithilfe der @ContextSingleton-Annotation wird garantiert, dass die annotierte Klasse je Kontext, also pro Activity oder Service, als Singleton injiziert wird. Zusätzlich gibt es einen Logger, der sich in Produktion für die Log-Level verbose und debug von selbst deaktiviert. Ebenfalls interessant ist die @Observer-Annotation, mit deren Hilfe der eigene Code deutlich entzerrt und somit modularer aufgebaut werden kann. Freunden des Experimentierens sei auch RoboGuice 2.0 beta 3, basierend auf Guice 3, mit Fragmentsupport, stark vereinfachtem Bootstraping und einigen weiteren kleinen Verbesserungen empfohlen. Einziger Wermutstropfen von RoboGuice ist die Größe des Frameworks, das mit über 100 Kilobyte im Vergleich zu den anderen vorgestellten Lösungen recht groß ausfällt. Hier können aber Tools wie ProGuard [6] helfen, den Footprint innerhalb der eigenen Anwendung deutlich zu verringern.

Fazit

Wer für Android Devices entwickelt, muss nicht automatisch auf das lieb gewonnene Konzept des Dependency Injection verzichten. Gleich mehrere Open-Source-Frameworks stellen dieses Feature aus der „echten“ Java-Welt auch Android-Entwicklern zur Verfügung. Für gestandene Spring-Entwickler bietet sich ein Blick auf das Spring ME Framework an, dessen Community allerdings überschaubar groß und nur semi-aktiv zu sein scheint. Freunde von Annotationen sollten sich dagegen eher auf AndroidAnnotations oder RoboGuice konzentrieren. Rein auf das Feature Dependency Injection bezogen, hat von den beiden Frameworks aktuell RoboGuice die Nase vorn. Aufgrund der wirklich guten Zusatzfeatures verdient aber neben RoboGuice auch das AndroidAnnotations-Framework das Prädikat „Cool Stuff“.

Lars Röwekamp ist Geschäftsführer der open knowledge GmbH und berät seit mehr als zehn Jahren Kunden in internationalen Projekten rund um das Thema Enterprise Computing (Twitter: @mobileLarson).

Arne Limburg ist Softwarearchitekt bei der open knowledge GmbH in Oldenburg. Er verfügt über langjährige Erfahrung als Entwickler, Architekt und Consultant im Java-Umfeld und ist auch seit der ersten Stunde im Android-Umfeld aktiv.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.