嗨,我想弄清楚如何做一个干净的第三方注射。我想将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)并看到它可能,但不确定事情是如何挂在一起的。
答案 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
非常慎重,并为我的问题提出了不同的解决方案。