向IntentService注入ToDoRepository时遇空指针问题求助
解决IntentService中Dagger注入Repository为空的问题
你遇到的核心问题是:Dagger Android 不会自动对 IntentService 进行依赖注入,直接在 IntentService 类中使用 @Inject 标记字段,Dagger 无法自动完成注入流程,导致你的 mToDoRepository 始终为 null。下面是具体的解决步骤:
步骤1:修改IntentService,手动触发注入
IntentService 属于 Android 系统服务,Dagger 不会自动初始化它的依赖,所以我们需要在 onCreate() 方法中手动调用注入方法:
public class ToDoDeleteNotificationService extends IntentService { @Inject ToDoRepository mToDoRepository; // IntentService 必须保留无参构造函数,否则系统无法实例化它 public ToDoDeleteNotificationService() { super("ToDoDeleteNotificationService"); } @Override public void onCreate() { // 关键:在super.onCreate()之前调用Dagger注入 AndroidInjection.inject(this); super.onCreate(); } @Override protected void onHandleIntent(@Nullable Intent intent) { assert intent != null; String toDoId = intent.getStringExtra(ToDoNotificationsService.TODO_MODEL_KEY); // 现在mToDoRepository已经被正确注入,可以正常调用方法 mToDoRepository.deleteToDo(toDoId); } }
步骤2:创建Service绑定模块,告知Dagger要注入这个Service
你需要创建一个模块,将 ToDoDeleteNotificationService 绑定到 Dagger 的注入体系中:
@Module public abstract class ServiceBindingModule { // 将Service映射到对应的注入器工厂 @Binds @IntoMap @ServiceKey(ToDoDeleteNotificationService.class) abstract AndroidInjector.Factory<? extends Service> bindToDoDeleteNotificationService(ToDoDeleteNotificationService.Subcomponent.Builder builder); // 为该Service创建子组件 @Subcomponent public interface Subcomponent extends AndroidInjector<ToDoDeleteNotificationService> { @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<ToDoDeleteNotificationService> {} } }
步骤3:将Service模块添加到AppComponent中
更新你的 AppComponent,把刚刚创建的 ServiceBindingModule 加入到 modules 列表里:
@Singleton @Component(modules = { ToDoRepositoryModule.class, ActivityBindingModule.class, AppModule.class, AndroidSupportInjectionModule.class, ServiceBindingModule.class // 新增这个模块 }) public interface AppComponent extends AndroidInjector<ToDoApplication> { ToDoRepository getToDoRepository(); @Component.Builder interface Builder { @BindsInstance AppComponent.Builder application(Application application); AppComponent build(); } }
额外检查项
- 确保你的
ToDoApplication正确继承了DaggerApplication并初始化了 Dagger 组件:
public class ToDoApplication extends DaggerApplication { @Override protected AndroidInjector<? extends DaggerApplication> applicationInjector() { return DaggerAppComponent.builder().application(this).build(); } }
- 检查
AndroidManifest.xml中是否正确注册了这个 Service:
<service android:name=".ToDoDeleteNotificationService" />
这样修改后,当 ToDoDeleteNotificationService 被启动时,Dagger 会在 onCreate() 阶段完成 mToDoRepository 的注入,就不会再出现 null 的情况了。
内容的提问来源于stack exchange,提问作者Martin Rico Martinez
相关产品推荐
相关产品推荐

