首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法在WorkManager的辅助类中插入单个类

无法在WorkManager的辅助类中插入单个类
EN

Stack Overflow用户
提问于 2018-05-25 19:37:39
回答 3查看 3.2K关注 0票数 3

我正在研究MVVM架构,我正在使用Dagger2进行数据注入。我面临的问题是,在Activity/Fragment中,@Inject工作得很好,但是在WorkManager的Worker类中,@Inject在运行时给出了空指针异常。我怎么解决它呢?

以下是Worker类代码:

代码语言:javascript
复制
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");

    }
    }

方法:

代码语言:javascript
复制
    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();

}
EN

回答 3

Stack Overflow用户

发布于 2018-06-01 04:22:29

要在worker类中注入字段,首先需要在AppComponent中注入worker类:

代码语言:javascript
复制
 fun inject(syncItemWorker: SyncItemWorker)

然后在worker的doWork()中,需要调用inject:

代码语言:javascript
复制
 if(applicationContext is MyApp){
        var daggerAppComponent= DaggerAppComponent.builder().application(applicationContext as MyApp).build()
        daggerAppComponent.inject(this)
    }
票数 5
EN

Stack Overflow用户

发布于 2018-08-19 16:12:05

您必须在模块中使用@Provides注解提供类以进行注入。

首先,创建一个包含模块的组件,该模块将提供类。

代码语言:javascript
复制
@Component(modules = {Module.class})
public interface Component1{

    void inject(MySyncManager mySyncManager);
}

模块类

代码语言:javascript
复制
@Module
public class Module{

    @Provides
    public DataManager provideDataManager(){
        return new DataManager();
    }

    @Provides
    public SchedulerProvider provideSchedulerProvider(){
        return new SchedulerProvider();
    }

}

现在在您的代码中编写一个用于将组件注入worker类的构造函数。

代码语言:javascript
复制
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上复制的,你可以查看

票数 0
EN

Stack Overflow用户

发布于 2019-03-20 22:37:41

考虑到构造函数注入,不推荐使用字段注入。这是一个很好的构造函数注入的例子,检查这个blog。基本上你可以像这样注入:

代码语言:javascript
复制
@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实现

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50528334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档