使用匕首 2 的计划作业服务中的依赖关系注入



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

在 JobService 构造函数中,我正在尝试在我的应用程序类上注入我的依赖项。

MyApp.component().inject(this);

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

也许我以错误的方式使用dagger?还是必须为作业服务创建自己的组件?

这是我的应用程序类

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();
}
}
}

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

首先确保你从你的build.gradle中添加了dagger-安卓依赖项

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片段,您将从MainActivityModule进行FragmentBuilderModule

@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。

相关内容

  • 没有找到相关文章

最新更新