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 .
- Cómo cargar baldosas de un mapa de bits grande en Android?
- Diferencia entre URL.openConnection () y URLConnection.connect ()?
- Renderizar una pequeña región de mapa de bits grande consume mucho tiempo
- Infinite Scrolling Image ViewPager
- Android - Cómo convertir la cadena en utf-8 en android
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
- Pase el constructor de la actividad al
Module
- Asegúrese de que construyo
ObjectGraph
después de hacersetContentView()
para que una instancia deActivity
adecuada se transmita aObjectGraph
.
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?
- Hilo con estados personalizados
- ¿Cómo obtener la respuesta de cadena de Retrofit2?
- tipo de letra de fuente de cambio de spinner android
- Cómo depurar cordova plugin y Registro con "android.util.log"
- "No pudo encontrar el error com_facebook_android.apk" al ejecutar el proyecto de Android
- El éxito de Retrofit.Callback () y el fallo () en caso de dos implementaciones de interfaz en la misma Actividad
- Android Análisis de señal y algunos filtros
- Obtener la aplicación seleccionada de Intent.createChooser
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.
- Acivity se está destruyendo mientras se presiona el botón de inicio.
- Establecer el elemento seleccionado por defecto del cuadro de diálogo de alerta de ListView en Android