当前位置: 首页 > 知识库问答 >
问题:

Dagger 2调度JobService中的依赖注入

谢建业
2023-03-14

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

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

MyApp.component().inject(this);

下面是我的应用程序类

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

共有1个答案

陶胤
2023-03-14

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

首先,确保在构建中添加了dagger-android依赖项。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();
    }
}
@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中创建一个FragmentBuilderModulefragmentBuilderModulefragmentBuilderModule

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

 类似资料:
  • 本文向大家介绍Dagger2 Android依赖注入学习笔记,包括了Dagger2 Android依赖注入学习笔记的使用技巧和注意事项,需要的朋友参考一下 前言 最近在用 MVP + RxJava + Retrofit 写项目,觉得相对于其他的开发框架,这的确是给我们带来了很多方便,但是在网上搜寻相关资料的时候,总是能看到 MVP + RxJava + Retrofit + Dagger 这样的搭

  • 我得到以下生成错误: 错误:[dagger.android.androidinjector.inject(T)]没有@provides-annotated方法,无法提供android.support.v4.app.fragmentManager。 公共抽象接口AppComponent扩展dagger.android.androidinjector{^android.support.v4.app.f

  • 我正在使用垃圾,模拟和模拟MVC来测试网络应用程序的工作。我正在与一个我无法弄清楚的注入的依赖关系作斗争。我的网络应用程序结构如下。 和服务级别 我需要测试此控制器的搜索方法,但是service2当前不活动,因此必须模拟对它的调用。我可以模拟service2,但不知道如何在控制器的mockMVC实例中注入service2的模拟。据我所知,mockito中的@InjectMocks只注入一层深度的m

  • 我有一个控制器 服务接口 我想在我的控制器中使用@autowired来使用该服务,但当我运行应用程序时,我得到以下错误 org.springframework.beans.factory.beanCreationException:创建名为“demo application”的bean时出错:注入autowired依赖项失败;嵌套异常为org.SpringFramework.Beans.Facto

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮