在Android中的预定作业服务中注入依赖项的最佳方法是什么。我的JobService计划在晚上运行来做一些事情。
在JobService构造函数中,我试图在我的Application类上注入我的依赖项。
MyApp.component().inject(this);
但有时qazxsw poi此时尚未初始化,因此注射失败。
也许我以错误的方式使用Dagger?或者我是否必须为JobService创建自己的组件?
这是我的Application类
MyApp
你应该使用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。