Dagger 2 Tercera parte Inyección Android
Hola estoy tratando de averiguar cómo hacer una inyección de terceros limpio. Quiero inyectar el bus Otto correctamente en mis servicios y actividades. Iv visto que se puede utilizar inyectar en el constructor, pero ya que no tengo ningún constructor con Android, me pregunto cómo puedo entonces inyectar mi autobús.
Iv creó un módulo que proporciona una nueva instancia del bus. Iv también creó un componente que tiene una interfaz para el objeto Bus.
- ¿Se aplican también a Dagger "Evita los marcos de inyección de dependencia" en la Guía de memoria de Android?
- Dagger no puede encontrar miembros inyectables en un módulo
- ¿Hay documentación sobre cuándo Dagger regresa a la reflexión al inyectar dependencias?
- Dagger con Android: ¿Cómo puedo inyectar el contexto actual?
- Ampliación de ObjectGraph con módulo de sustitución
¿Pero cómo puedo conseguir esto inyectado y dónde debo comenzar mi gráfico?
Dado que el objetoGraph de Dagger 1 se elimina, utilizo el componente Dagger _…. y create () en la clase de aplicación, pero ¿cómo debo inyectarlo en cualquier actividad o servicio?
¿Debo crear el componente en cada onCreate y obtener el autobús desde allí? ¿O es posible @Inject como Dagger 1? Por favor, dime porque ahora mismo parece mucho más grueso y complicado que Dagger 1 manera de hacerlo.
@Component(modules = EventBusModule.class) @Singleton public interface EventBus { Bus bus(); } @Module public class EventBusModule { @Provides @Singleton public Bus provideBus() { return new Bus(ThreadEnforcer.ANY); } }
Todo lo que quiero ser capaz de hacer es:
public class WearService extends WearableListenerService { private static final String TAG = WearService.class.getSimpleName(); @Inject protected Bus bus; @Override public int onStartCommand(Intent intent, int flags, int startId) { bus.register(this); return START_STICKY; } }
Miro este ejemplo ( https://github.com/LiveTyping/u2020-mvp ) y veo que es posible, pero no estoy seguro de cómo las cosas están colgando juntos.
- Cómo compartir Dagger2 Subcomponente entre activies
- ¿Se puede utilizar Spring Framework en aplicaciones android?
- Uso de Dagger para inyección de dependencia en constructores
- Dagger para Android: Inyección de una actividad en el gráfico de objetos después de llamar a setContentView
- Singletons en Dagger 1.x
- Bean and EBean conception Anotaciones para Android
- Square Dagger IllegalStateException: No se pudo cargar el adaptador de módulo para la clase MyApplicationModule
- ¿Cómo usar la biblioteca dagger en el proyecto de la biblioteca android?
Es bastante usual instanciar el componente Dagger en la instancia de Application
. Dado que probablemente no tiene una referencia a su WearService
de su clase de Application
, tendrá que hacer que el WearService
pedir a su Application
para proporcionar el Bus
.
Puede hacer esto de dos maneras:
-
Al agregar un método de
inject(WearService wearService)
a su componenteEventBus
:@Component(modules = EventBusModule.class) @Singleton public interface EventBus { Bus bus(); void inject(WearService wearService); }
Ahora puede mantener una referencia a su Componente en su
Application
:public class MyApplication extends Application { private EventBus mEventBusComponent; @Override public void onCreate() { super.onCreate(); mEventBusComponent = Dagger_EventBus.create(); } public void inject(WearService wearService) { mEventBusComponent.inject(wearService); } }
Desde su
WearService
, solicite a suApplication
que lo inyecte:public class WearService extends WearableListenerService { private static final String TAG = WearService.class.getSimpleName(); @Inject protected Bus bus; @Override public int onStartCommand(Intent intent, int flags, int startId) { ((MyApplication) getApplicationContext()).inject(this); bus.register(this); return START_STICKY; } }
-
Recuperando el
Bus
manualmente. Agregue un método getter para el componenteEventBus
en laApplication
:public class MyApplication extends Application { private EventBus mEventBusComponent; @Override public void onCreate() { super.onCreate(); mEventBusComponent = Dagger_EventBus.create(); } public EventBus getEventBusComponent() { return mEventBusComponent; } }
Luego, en su
WearService
, llame al métodobus()
:public class WearService extends WearableListenerService { private static final String TAG = WearService.class.getSimpleName(); private Bus bus; @Override public int onStartCommand(Intent intent, int flags, int startId) { bus = ((MyApplication) getApplicationContext()).getEventBusModule().bus(); bus.register(this); return START_STICKY; } }
Para inyectar el Bus
en clases que puede instanciar, puede utilizar la inyección del constructor:
public class MyClass() { private final Bus mBus; @Inject public MyClass(final Bus bus) { mBus = bus; } }
Ya que Dagger sabe cómo crear una instancia de Bus
(debido a su método @Provides
), Dagger también sabrá cómo crear una instancia de MyClass
, no se @Provides
ningún método @Provides
. Por ejemplo, esto funcionará:
public class WearService extends WearableListenerService { private static final String TAG = WearService.class.getSimpleName(); @Inject protected Bus bus; @Inject protected MyClass myClass; @Override public int onStartCommand(Intent intent, int flags, int startId) { ((MyApplication) getApplicationContext()).inject(this); bus.register(this); return START_STICKY; } }
La instancia MyClass
creará automáticamente para usted, con la misma instancia de Bus
(ya que está marcada como @Singleton
).
Después de algunas discusiones con Niek con respecto a mi pregunta, fui a la fuente para encontrar mi respuesta. Pregunté en el reporte de github de daga 2, y la respuesta se puede encontrar aquí:
https://github.com/google/dagger/issues/128#issuecomment-86702574
Es muy deliberada y publica diferentes soluciones a mi problema.
- Extraño "No se pudo enviar el evento" y "Ningún suscriptor registrado para el evento"
- Android ClassNotFoundException for Support v7 TestActivity