我是Dagger的新手。在其doc中,它被说成了
第三方课程无法注释
但是在这个UpcomingMoviesMVP示例中,它会在MainActivity中注入OTTO总线:
public class MainActivity extends BaseActivity {
@Inject
protected Bus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
registerBus();
}
@Override
protected void onPause() {
super.onPause();
unRegisterBus();
}
private void registerBus() {
bus.register(this);
}
private void unRegisterBus() {
bus.unregister(this);
}
@Subscribe
public void onItemSelectedEvent(MovieSelectedEvent event) {
launchMovieDetailsActivity(event.getMovie());
}
所以我认为Dagger应该调用Bus的默认构造函数(当然,Bus构造函数中没有注入注释)。但它似乎与“第三方课程无法注释”相冲突?
答案 0 :(得分:3)
我认为Dagger应该调用Bus
的默认构造函数
如果有多个构造函数怎么办?它选择哪个?
Dagger不会随机创建类实例。你必须告诉它自己使用或创建它。
在这种情况下,Bus
可以使用@Inject
构造函数进行注释。这将允许Dagger在没有任何其他情况下注入它。然而,奥托没有这个,所以它必须来自其他地方。
另一种方法是编写提供者方法。
@Provides @Singleton Bus provideBus() {
return new Bus();
}
这种方法(用匕首@Module
编写)将为Dagger提供一种获取Bus
实例的方法。由于它是用@Singleton
注释的,因此Dagger只会调用此方法一次,并在每次请求时反复使用该实例。