Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 了解Dagger2流程(提供样本)_Java_Android_Dependency Injection_Rx Java_Dagger 2 - Fatal编程技术网

Java 了解Dagger2流程(提供样本)

Java 了解Dagger2流程(提供样本),java,android,dependency-injection,rx-java,dagger-2,Java,Android,Dependency Injection,Rx Java,Dagger 2,我正试图在我的项目中使用Dagger2来改进RxJava和MVP实现。然而,我从阅读指南和观看视频开始,就在我认为我了解它是如何工作的时候,似乎我不知道。这就是我想要了解的样本 模块: @Module public class AppModule { private App app; public AppModule(App app) { this.app = app; } @Provides @Singleton public SharedPreferences p

我正试图在我的项目中使用Dagger2来改进RxJava和MVP实现。然而,我从阅读指南和观看视频开始,就在我认为我了解它是如何工作的时候,似乎我不知道。这就是我想要了解的样本

模块:

@Module
public class AppModule {
  private App app;

  public AppModule(App app) {
    this.app = app;
  }

  @Provides @Singleton public SharedPreferences provideSharedPreferences() {
    return PreferenceManager.getDefaultSharedPreferences(app);
  }

  @Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
      HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
    return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
  }

  @Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
    return new HelloDiskCache(prefs);
  }

  @Provides public HelloService provideHelloService() {
    return new HelloService();
  }

  @Provides public SchedulerProvider provideSchedulerProvider() {
    return SchedulerProvider.DEFAULT;
  }

  @Provides public Clock provideClock() {
    return Clock.REAL;
  }

  @Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
      return null;
  }
组成部分

@Component(
    modules = AppModule.class
)
@Singleton
public interface AppComponent {
  HelloModel getHelloModel();
  HelloDiskCache getHelloDiskCache();
  MainActivity inject(MainActivity activity);
  HelloFragment inject(HelloFragment fragment);
}
在片段中,演示者被注入(这是从哪里来的?)

在演示者中,有一个构造函数注入

  @Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}


那么,为什么我们可以在片段中注入演示者,为什么我们可以注入演示者?答案不必太详细,我只是觉得自己很愚蠢,因为我无法追踪它的来源。

@Inject
-带注释的构造函数是
@的替代方法,它为依赖项提供了带注释的方法,而无需进行太多配置

由于
HelloPresenter
有这样的构造函数,Dagger会自动发现它,并能够注入此依赖项,或使用它来构造和提供图形中的其他对象

带有
@Inject
-注释构造函数的类本身可以用范围注释(例如,
@Singleton
)注释。在这种情况下,只有具有匹配作用域的组件才能看到它


一般来说,这种提供依赖关系的类型不太详细,但并非总是可以使用它(例如,
活动
共享引用
)。在这种情况下,您必须使用
@模块
,并且
@提供了
方法。

您可以查看此示例,其中Dagger2与MVP架构一起使用


嗯,我明白了,在阅读了一些教程之后,我有一种印象,那就是组件中需要提到注入发生的所有位置,但这只适用于您调用的位置,例如App.getAppComponent(getActivity())。例如,在片段中注入(this)。我想我的问题是理解为什么我可以在不在组件中的类中使用@Inject,而不在oncreate中执行Inject操作。@buddhabath在字段和构造函数上使用
@Inject
注释可能会有一些混淆,这是完全不同的。使用
@Inject
注释字段时,确实需要调用
App.getAppComponent(getActivity()).Inject(this)
以满足此依赖关系。另一方面,当您注释构造函数时,您告诉Dagger,如果它在其图形创建活动中需要该类,它可以使用该构造函数。没有办法不调用
…inject(这个)
活动中的
,因为您无法访问其构造函数,也无法将其字段作为构造函数参数提供。
@Inject
注释构造函数的另一个优点是,它的参数是从图形中自动提供的,您通常使用它们填充类字段。在您的示例中,
HelloPresenter(helloModel helloModel)
中的
helloModel
是由组件中的
provideHelloModel()
提供的,因为这两个依赖项提供程序对组件都是可见的。这会清除部分依赖项,但假设我在presenter中添加了一个字段。(我已经这样做了,我只是想知道为什么它会工作)在模块中,我创建了一个provideOmdbService,它返回一个改装.create(OmdbService.class),在presenter中,我注入了OmdbService,这是因为InjectMainPresenter构造函数。下面是我添加的内容的粘贴,基本上我只是在presenter中的一个按钮上调用refresh2
  @Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;