[几天前,我一直在与Android Workmanager结合/注入实现Dagger。基本上这可以正常工作,但是打开应用程序时出现错误(应用程序在后台处于活动状态)。
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();
}
AppComponent:
@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();
}
}
BaseActivity:
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);
}
摘自WorkManager.initialize()
的文档:
如果多次调用,此方法将引发异常。
虽然WorkManager.initialize()
的每个实例仅调用BaseActivity
一次,但您不能期望在onCreate()
的生存期内只有一个BaseActivity
实例。具体来说,如果用户启动您的应用程序,通过按“后退”按钮退出,然后稍后再次启动您的应用程序,这是不可避免的。第二个实例还将尝试初始化Application
中的WorkManager
,这将引发异常。
同一文档为初始化onCreate()
提供了更好的位置:
- 在
WorkManager
或Application#onCreate
中调用此方法。请注意,此方法必须在这两个位置之一中被调用,否则您就有冒险在ContentProvider
中获得一个NullPointerException
。