使用Dagger 2在预定的JobService中注入依赖项

问题描述 投票:0回答:1

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

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

MyApp.component().inject(this);

但有时qazxsw poi此时尚未初始化,因此注射失败。

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

这是我的Application类

MyApp
android dependency-injection dagger jobservice
1个回答
0
投票

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

首先确保你从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(); } } } 添加了dagger-android依赖

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(); } } ActivityBuilderModule使用方便的注释ServiceBuilderModule引用所有活动和服务子组件,它将自动为您生成子组件

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。

© www.soinside.com 2019 - 2024. All rights reserved.