Dolch für Android: Eine Aktivität in das Objektdiagramm einfügen, nachdem setContentView aufgerufen wurde

8

Ich möchte Dagger auf Android verwenden, um eine Instanz von Activity wie folgt in eine andere Klasse zu injizieren:

%Vor%

Ich kann die Injektion durchführen, aber alle Felder von Activity sind null zum Zeitpunkt der Injektion .

Hier mache ich die Injektion:

My Activity ist ein Modul für sich.

%Vor%

Dies ist mein Hauptmodul

%Vor%

Und meine Application -Klasse, die das Objektdiagramm bootstrappt.

%Vor%

Ich suche nach einer Möglichkeit, die Injektion explizit auszuführen, nachdem ich setContentView aufgerufen habe.

Wie gehe ich dabei vor?

EDIT 1:

Ich habe es so gemacht - aber ich bin mir nicht sicher, ob das der "richtige Weg" ist. Was ich mache ist

  1. Übergeben Sie die Aktivität an den Module -Konstruktor
  2. Stellen Sie sicher, dass ich die ObjectGraph nach erstellt habe. setContentView() , damit eine richtige Activity -Instanz an die ObjectGraph weitergegeben wird.

Mein Activity ist kein Dolch mehr Module .

Dies wird im folgenden Code umgesetzt:

%Vor%

Und so sieht mein Activity aus:

%Vor%

Diese Lösung scheint die von Jesse Wilson in auf diese Antwort angesprochenen Punkte anzusprechen. Allerdings mache ich mir Sorgen um die Leistung, da die ObjectGraph jedes Mal, wenn Activity erstellt wird, erstellt wird.

Irgendwelche Gedanken?

    
curioustechizen 21.12.2012, 07:36
quelle

1 Antwort

19

Leider wird dies wahrscheinlich nicht mit Dagger oder mit den meisten anderen Abhängigkeits-Injection-Frameworks funktionieren. Das Problem ist, dass der Lebenszyklus von Activity nicht sauber mit dem Lebenszyklus von PresentationLayer übereinstimmt. Wenn Sie beispielsweise Ihren Bildschirm drehen, zerstört Android die Aktivität und erstellt stattdessen eine andere. Es gibt keinen Haken für PresentationLayer , um daran teilzunehmen.

Im Square verwenden wir Otto , um zwischen Aktivitäten und ihren Backends zu kommunizieren, und es hat gut funktioniert. Siehe Eric Burkes Beispielcode-Projekt für ein Beispiel.

    
Jesse Wilson 21.12.2012, 14:42
quelle