【问题标题】:Android: Workmanager Dagger (Did you try to initialize it manually without disabling WorkManagerInitializer)Android:Workmanager Dagger(您是否尝试在不禁用 WorkManagerInitializer 的情况下手动初始化它)
【发布时间】:2020-04-17 08:09:52
【问题描述】:

几天前,我一直致力于将 Dagger 与 Android Workmanager 结合/注入。基本上这可以完美运行,但是当我打开应用程序时出现错误(应用程序在后台处于活动状态)。

WorkManager 已经初始化。您是否尝试在不禁用 WorkManagerInitializer 的情况下手动初始化它?有关详细信息,请参阅 WorkManager#initialize(Context, Configuration) 或类级别 Javadoc。

您以前是否遇到过这个问题,我该如何解决?以下是我的应用程序代码的一些快照。

清单文件

<provider
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="{packagename}.workmanager-init"
            android:exported="false"
            android:enabled="false"
            tools:node="remove" />

WorkerBindingModule

@Module
public interface WorkerBindingModule {

    @Binds
    @IntoMap
    @WorkerKey(VVSArtikelWorker.class)
    GithubWorkerFactory bindVVSArtikelWorker(VVSArtikelWorker.Factory factory);

    @Binds
    @IntoMap
    @WorkerKey(ArticleInventoryWorker.class)
    GithubWorkerFactory bindArticleInventoryWorker(ArticleInventoryWorker.Factory factory);
}

WorkerKey

@MapKey
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkerKey {

    Class<? extends ListenableWorker> value();
}

应用组件

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        ActivityBuildersModule.class,
        ViewModelFactoryModule.class,
        RoomModule.class,
        NetworkModule.class,
        WorkerBindingModule.class
})
public interface AppComponent extends AndroidInjector<XVSApplication> {

    UserSessionManager userSessionManager();
    XVSWorkerFactory appGithubWorkerFactory();

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();

    }
}

XVSApplication

public class XVSApplication extends DaggerApplication {

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }
}

基础活动

public class BaseActivity extends DaggerAppCompatActivity {

    private static final String TAG = "BaseActivity";

    @Inject
    public UserSessionManager userSessionManager;

    @Inject
    XVSWorkerFactory factory;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        subscribeObservers();
        configurationBuilderWorkManager();
        setupPeriodicWork();
    }
.....
    private void setupPeriodicWork() {
//        Constraints constraints = new Constraints.Builder().setRequiresBatteryNotLow(true).setRequiredNetworkType(NetworkType.CONNECTED).build();
        PeriodicWorkRequest periodicWorkRequestVVSArticle = new PeriodicWorkRequest.Builder(VVSArtikelWorker.class, 12, TimeUnit.HOURS).build();
        WorkManager.getInstance(this).enqueue(periodicWorkRequestVVSArticle);

        PeriodicWorkRequest periodicWorkRequestArticleOrder = new PeriodicWorkRequest.Builder(ArticleInventoryWorker.class, 1, TimeUnit.HOURS)
                .build();
        WorkManager.getInstance(this).enqueue(periodicWorkRequestArticleOrder);
    }

  private void configurationBuilderWorkManager() {
        Configuration config = new Configuration.Builder()
                .setWorkerFactory(factory)
                .build();

        WorkManager.initialize(this, config);
    }

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    来自WorkManager.initialize() 的文档:

    这个方法如果被多次调用会抛出异常。

    虽然BaseActivity 的每个实例仅调用onCreate() 一次,但您不能期望在Application 的生命周期内只有一个BaseActivity 实例。具体来说,如果用户启动您的应用程序,按后退按钮退出,然后稍后再次启动您的应用程序,这是不可避免的。第二个实例也会尝试在onCreate()中初始化WorkManager,这会引发异常。

    相同的文档提出了一个更好的初始化WorkManager的地方:

    • Application#onCreateContentProvider 中调用此方法。请注意,此方法必须在这两个位置之一调用,否则您可能会在getInstance(Context) 中获得NullPointerException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多