Dagger para Android: Inyección de una actividad en el gráfico de objetos después de llamar a setContentView

Quiero usar Dagger en Android para inyectar una instancia de una Activity en otra clase de la siguiente manera:

 class PresentationLayer{ Activity mActivity; @Inject public PresentationLayer(Activity activity){ this.mActivity = activity; } public void presentData(User user){ ((TextView)mActivity.findViewById(R.id.username)) .setText(user.getName()); //... //... } } 

Puedo hacer la inyección, pero todos los campos de la Activity son null en el momento de la inyección .

Así es como estoy haciendo la inyección:

Mi Activity es un módulo en sí mismo.

 @Module( complete = false ) class MainActivity extends Activity{ @Override public void onCreate(Bundle bundle){ super.onCreate(bundle); setContentView(R.layout.main_activity); ObjectGraph objectGraph = CustomApplication.getObjectGraph(); PresentationLayer pres = objectGraph.get(PresentationLayer.class); } @Provides Activity provideActivity(){ return this; } } 

Este es mi módulo principal

 @Module( entryPoints = PresentationLayer.class, includes = MainActivity.class ) class DaggerModule{ @Provides PresentationLayer providePresentation(Activity activity){ return new PresentationLayer(activity); } } 

Y mi clase de Application que arranca el gráfico de objetos.

 class CustomApplication extends Application{ private static ObjectGraph sObjectGraph; @Override public void onCreate(){ sObjectGraph = ObjectGraph.create(new DaggerModule()); } static getObjectGraph(){ return sObjectGraph; } } 

Estoy buscando una manera de realizar explícitamente la inyección después de llamar a setContentView .

¿Cómo voy a hacer esto?


EDIT 1:

Lo conseguí trabajar como esto – sin embargo no estoy seguro si éste es el "camino derecho". Lo que hago es

  1. Pase el constructor de la actividad al Module
  2. Asegúrese de que construyo ObjectGraph después de hacer setContentView() para que una instancia de Activity adecuada se transmita a ObjectGraph .

Mi Activity ya no es un Module daga.

Esto se traduce en lo siguiente en código:

 @Module( entryPoints = PresentationLayer.class ) class DaggerModule{ private Activity mActivity; public DaggerModule (Activity activity){ this.mActivity = activity; } @Provides PresentationLayer providePresentation(){ return new PresentationLayer(mActivity); } } 

Y así es como se ve mi Activity :

 class MainActivity extends Activity{ @Override public void onCreate(Bundle bundle){ super.onCreate(bundle); setContentView(R.layout.main_activity); ObjectGraph objectGraph = CustomApplication.getObjectGraph(this); PresentationLayer pres = objectGraph.get(PresentationLayer.class); User user = //get the user here pres.presentData(user); } } 

Esta solución parece abordar los puntos planteados por Jesse Wilson en esta respuesta . Sin embargo, estoy preocupado por el rendimiento, ya que el ObjectGraph va a ser construido cada vez que se crea la Activity .

¿Alguna idea?

Desafortunadamente esto probablemente no va a funcionar con Dagger, o con la mayoría de otros marcos de inyección de dependencia. El problema es que el ciclo de vida de Activity no se alinea de forma limpia con el ciclo de vida de PresentationLayer . Por ejemplo, cuando giras tu pantalla, Android destruirá la actividad y creará otra en su lugar. No hay gancho para que PresentationLayer participe en eso.

En Square hemos estado usando Otto para comunicarse entre las actividades y sus backends y ha funcionado bien. Véase el proyecto de código de ejemplo de Eric Burke como ejemplo.

  • Incluyendo los servicios de Google Play en el proyecto de Android Studio
  • Cómo pausar una Httpurlconnection en android en el botón de clic
  • Parse Json en el estudio android de String
  • Cómo construir una fecha de una cadena
  • Android: java.lang.NullPointerException: Intenta invocar el método virtual 'java.lang.String java.lang.Object.toString ()' en una referencia de objeto nulo
  • Dagger 2 en Android @Singleton clase anotada que no se inyecta
  • Cómo centrar un ImageView verticalmente en su matriz?
  • Androide. Iniciar aplicación desde Dialer
  • Java.lang.IllegalStateException: No se pudo leer la fila 0, col 0 de CursorWindow
  • Creación de una base de datos de aplicaciones para Android con gran cantidad de datos
  • Calcular la diferencia entre dos veces en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.