android - Android:Workmanager Dagger(您是否尝试在不禁用 WorkManagerInitializer 的情况下手动初始化它)
问题描述
几天前,我一直在努力实现 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" />
工人绑定模块:
@Module
public interface WorkerBindingModule {
@Binds
@IntoMap
@WorkerKey(VVSArtikelWorker.class)
GithubWorkerFactory bindVVSArtikelWorker(VVSArtikelWorker.Factory factory);
@Binds
@IntoMap
@WorkerKey(ArticleInventoryWorker.class)
GithubWorkerFactory bindArticleInventoryWorker(ArticleInventoryWorker.Factory factory);
}
工人密钥:
@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();
}
}
XVS应用:
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);
}
解决方案
如果多次调用此方法,则会引发异常。
虽然每个实例BaseActivity
只调用onCreate()
一次,但您不能期望BaseActivity
在您Application
的生命周期中只有一个实例。具体来说,如果用户启动您的应用程序,按后退按钮退出,然后稍后再次启动您的应用程序,这是不可避免的。第二个实例也将尝试初始化WorkManager
in onCreate()
,这会引发异常。
相同的文档提出了一个更好的初始化位置WorkManager
:
Application#onCreate
在或中调用此方法ContentProvider
。请注意,必须在这两个地方之一调用此方法,否则您可能会遇到NullPointerException
.getInstance(Context)
推荐阅读
- python-3.x - 为什么以下代码的代码显示 NameError
- python - 无法使用 python 打开数据库 [Microsoft] [ODBC Driver 13 for SQL Server]
- javascript - 如果在页面中找到文本,则自动单击按钮
- api - DocuSign API 与 RESTful Web 服务的集成问题:javax.ws.rs-api-2.0.1.jar
- java - 如何将文本文件中的不同列复制到变量中
- system-verilog - 如何在 systemverilog 中转换为 longint unsigned?
- javascript - Chart.js 点击事件打开自定义工具提示有时不起作用
- spring - Spring Batch - 根据条件循环回任何上一步
- swift - 有谁知道如何让它工作我正在尝试使用 pagecontrol 制作幻灯片,但索引显示错误
- floating-point - 手动将 Double 转换为 Float,反之亦然