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.

¿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.

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 componente EventBus :

     @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 su Application 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 componente EventBus en la Application :

     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étodo bus() :

     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.

  • Android Dagger Dependency Injection falla en campos privados
  • Dagger 2 - Inyectar bibliotecas de terceros en servicios y actividades de Android
  • Daga: Inyectar campo en el pojo proporcionado
  • Módulo dependiendo de otro módulo en Dagger
  • Dagger y inyecciones anidadas
  • Inyectar dependencias en singleton con Dagger?
  • Inyección de clase genérica con Dagger
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.