我正在研究MVVM架构,我正在使用Dagger2进行数据注入。我面临的问题是,在Activity/Fragment中,@Inject工作得很好,但是在WorkManager的Worker类中,@Inject在运行时给出了空指针异常。我怎么解决它呢?
以下是Worker类代码:
public class MySyncManager extends Worker {
@Inject
DataManager dataManager;
@Inject
SchedulerProvider schedulerProvider;
@NonNull
@Override
public WorkerResult doWork() {
CommonUtils.Log("usm_work_manager_1", "Work is Started.");
if(dataManager==null)
CommonUtils.Log("usm_work_manager", "Injector is NULL");
}
}
方法:
private void startTestSyncRequest() {
Constraints myConstraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MySyncManager.class)
.setConstraints(myConstraints)
.setInitialDelay(1, TimeUnit.SECONDS) // wait for n seconds before starting service
.build();
WorkManager.getInstance()
.beginUniqueWork(Tags.TEST_WORK_NAME, ExistingWorkPolicy.REPLACE, workRequest)
.enqueue();
}
发布于 2018-06-01 04:22:29
要在worker类中注入字段,首先需要在AppComponent中注入worker类:
fun inject(syncItemWorker: SyncItemWorker)
然后在worker的doWork()中,需要调用inject:
if(applicationContext is MyApp){
var daggerAppComponent= DaggerAppComponent.builder().application(applicationContext as MyApp).build()
daggerAppComponent.inject(this)
}
发布于 2018-08-19 16:12:05
您必须在模块中使用@Provides注解提供类以进行注入。
首先,创建一个包含模块的组件,该模块将提供类。
@Component(modules = {Module.class})
public interface Component1{
void inject(MySyncManager mySyncManager);
}
模块类
@Module
public class Module{
@Provides
public DataManager provideDataManager(){
return new DataManager();
}
@Provides
public SchedulerProvider provideSchedulerProvider(){
return new SchedulerProvider();
}
}
现在在您的代码中编写一个用于将组件注入worker类的构造函数。
public class MySyncManager extends Worker {
@Inject
DataManager dataManager;
@Inject
SchedulerProvider schedulerProvider;
public MySyncManager(){
DaggerComponent1.builder().build().inject();
}
@NonNull
@Override
public Result doWork() {
sync();
return Result.SUCCESS;
}
private void sync() {
}
}
这个答案是从this SO post上复制的,你可以查看
发布于 2019-03-20 22:37:41
考虑到构造函数注入,不推荐使用字段注入。这是一个很好的构造函数注入的例子,检查这个blog。基本上你可以像这样注入:
@AssistedInject
public PrePopulateDataWorker(@Assisted @NonNull Context context, @Assisted @NonNull WorkerParameters workerParams, DataManager dataManager) {
super(context, workerParams);
this.dataManager = dataManager;
}
@AssistedInject.Factory
public interface Factory extends CustomWorkerFactory {}
这里注入了DataManger
的实例。Here是Java实现
https://stackoverflow.com/questions/50528334
复制相似问题