匕首:第三方课程无法注释?

时间:2015-03-27 10:42:05

标签: android dagger

我是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构造函数中没有注入注释)。但它似乎与“第三方课程无法注释”相冲突?

1 个答案:

答案 0 :(得分:3)

  

我认为Dagger应该调用Bus

的默认构造函数

如果有多个构造函数怎么办?它选择哪个?

Dagger不会随机创建类实例。你必须告诉它自己使用或创建它。

在这种情况下,Bus可以使用@Inject构造函数进行注释。这将允许Dagger在没有任何其他情况下注入它。然而,奥托没有这个,所以它必须来自其他地方。

另一种方法是编写提供者方法。

@Provides @Singleton Bus provideBus() {
  return new Bus();
}

这种方法(用匕首@Module编写)将为Dagger提供一种获取Bus实例的方法。由于它是用@Singleton注释的,因此Dagger只会调用此方法一次,并在每次请求时反复使用该实例。