Dagger 2第三部分Android注入

时间:2015-03-05 06:37:19

标签: android dependency-injection dagger

嗨,我想弄清楚如何做一个干净的第三方注射。我想将Otto公共汽车正确地注入我的服务和活动中。 我看到你可以使用注入构造函数,但由于我没有Android的任何构造函数,我想知道如何我可以注入我的总线。

Iv创建了一个模块,它提供了一个新的总线实例。 Iv还创建了一个具有Bus对象接口的组件。

但是我怎样才能注入这个?我应该在哪里开始我的图表?

由于删除了Dagger 1中的objectGraph,我在应用程序类中使用了Dagger _....组件和create(),但是我应该如何将它注入任何活动或服务?

我应该在每个onCreate中创建组件并从那里获取总线吗?或者像Dagger 1一样可以@Inject吗?请告诉我,因为现在它看起来比Dagger 1做的更加笨拙和复杂。

@Component(modules = EventBusModule.class)
@Singleton
public interface EventBus {
    Bus bus();
}

@Module
public class EventBusModule {

   @Provides
   @Singleton
   public Bus provideBus() {
       return new Bus(ThreadEnforcer.ANY);
   }
}

我希望能够做到的只有:

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;
    }
}

我看一下这个例子(https://github.com/LiveTyping/u2020-mvp)并看到它可能,但不确定事情是如何挂在一起的。

2 个答案:

答案 0 :(得分:3)

Application实例中实例化Dagger组件是很常见的。由于您可能无法在WearService课程中提及Application,因此您需要WearService询问您的Application提供的内容Bus

您可以通过两种方式执行此操作:

  • inject(WearService wearService)组件添加EventBus方法:

    @Component(modules = EventBusModule.class)
    @Singleton
    public interface EventBus {
        Bus bus();
    
        void inject(WearService wearService);
    }
    

    您现在可以在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);
        }
    }
    

    WearService,请Application注入它:

    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;
        }
    }
    
  • 手动检索Bus。在EventBus

    中为Application组件添加getter方法
    public class MyApplication extends Application {
    
        private EventBus mEventBusComponent;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            mEventBusComponent = Dagger_EventBus.create();
        }
    
        public EventBus getEventBusComponent() {
            return mEventBusComponent;
        }
    }
    

    然后,在WearService中,调用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;
        }
    }
    

要将Bus注入到可以实例化的类中,您可以使用构造函数注入:

public class MyClass() {

  private final Bus mBus;

  @Inject
  public MyClass(final Bus bus) {
    mBus = bus;
  }
}

由于Dagger知道如何创建Bus实例(因为您的@Provides方法),Dagger现在也知道如何创建MyClass实例,而不是@Provides必要的方法。例如,这将起作用:

    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;
        }
    }

MyClass实例将自动为您创建,并使用相同的Bus实例(因为它标记为@Singleton)。

答案 1 :(得分:1)

在与Niek就我的问题进行一些讨论之后,我去了消息来源找到答案。我问匕首2的github回购,答案可以在这里找到:

https://github.com/google/dagger/issues/128#issuecomment-86702574

非常慎重,并为我的问题提出了不同的解决方案。