1

在 Android 的计划作业服务中注入依赖项的最佳方法是什么。我的 JobService 计划在晚上运行以做一些事情。

在 JobService 构造函数中,我试图将我的依赖项注入到我的 Application 类上。

MyApp.component().inject(this);

但有时MyApp此时未初始化,因此注入失败。

也许我以错误的方式使用 Dagger?还是我必须为 JobService 创建一个自己的组件?

这是我的应用程序类

public class MyApp extends Application {
  private static AppComponent appComponent;

  @Override
  public void onCreate() {
    super.onCreate();

    buildAppComponent();

  }

  public static AppComponent component(){
    return appComponent;
  }

  private void buildAppComponent(){
    if(appComponent == null){
        appComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();
    }
  }
}
4

1 回答 1

0

您应该使用 AndroidInjector 来注入 android 类,例如 Activities/Fragments/Services/BroadcastReceivers/ContentProviders。

首先确保您从您的build.gradle

implementation 'com.google.dagger:dagger:2.16'
implementation 'com.google.dagger:dagger-android:2.16'
implementation 'com.google.dagger:dagger-android-support:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'

然后确保您的应用程序组件继承自AndroidInjector

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class,
                      ApplicationModule.class,
                      ActivityBuilderModule::class,
                      ServiceBuilderModule::class})
public interface ApplicationComponent extends AndroidInjector<MyApp> {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(MyApp application);

        ApplicationComponent build();
    }
}

ActivityBuilderModuleServiceBuilderModule使用方便的注释引用您所有的活动和服务子组件,该注释ContributesAndroidInjector将为您自动生成子组件

@Module
abstract class ActivityBuilderModule {
    @ContributesAndroidInjector(modules = {MainActivityModule.class})
    @ActivityScope
    abstract MainActivity contributeMainActivity();

    @ContributesAndroidInjector(modules = {DummyModule.class})
    @ActivityScope
    abstract DummyActivity contributeDummyActivity();

    //...
}

服务也一样

@Module
abstract class ServiceBuilderModule {
    @ContributesAndroidInjector
    abstract MyService contributeAuthenticatorService();

    //...
}

最后在这里你MyApp应该是什么样子

public class MyApp extends DaggerApplication() {
    private ApplicationComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerApplicationComponent.builder()
                                                  .application(this)
                                                  .build();
    }

    AndroidInjector<? extends DaggerApplication> applicationInjector(){
        return appComponent;
    }
}

您的服务现在应该是可注入的,为了将其包装起来,您当然也需要注入片段,例如,对于MainActivity片段,您FragmentBuilderModule将从您的MainActivityModule

@Module(includes = {FragmentBuilderModule.class})
abstract class MainActivityModule {
    @Binds
    @ActivityScope
    abstract AppCompatActivity bindActivity(MainActivity activity);

    //...
}

在这里FragmentBuilderModule上课

@Module
abstract class FragmentBuilderModule {
    @ContributesAndroidInjector(modules = {HomeFragmentModule.class})
    @FragmentScope
    abstract HomeFragment contributeHomeFragment();

    @ContributesAndroidInjector(modules = DummyFragmentModule.class})
    @FragmentScope
    abstract DummyFragment contributeDummyFragment() ;

    //...
}

尽管它是 kotlin ,但您可以从我的项目模板中看到更多信息。

于 2018-09-17T20:14:28.453 回答