gpt4 book ai didi

android - WorkManager 在尝试将唯一的周期性工作排入 Application#onCreate 时崩溃

转载 作者:行者123 更新时间:2023-12-05 00:07:55 28 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic在这里,这个问题的解决方式不太可能帮助 future 的读者。


2年前关闭。







Improve this question




我想使用 WorkManager 和 Dagger 2 将依赖项注入(inject) worker 。我关注了this article实现设置。设置的一部分是按需初始化。为了实现它,我在 list 文件中添加了以下几行:

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

并使我的应用程序类实现 Configuration.Provider像这样的界面:
    @NonNull
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder().setMinimumLoggingLevel(Log.DEBUG).setWorkerFactory(delegatingWorkerFactory).build();
}

Dagger 设置按预期工作。

但是我遇到了以下问题:在 Application#onCreate我将唯一的定期任务排入队列,并且在第一次安装应用程序时,此操作总是失败并出现以下错误:
java.lang.IllegalStateException: The file system on the device is in a bad state. WorkManager cannot access the app's internal data store.
at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:115)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:211)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:195)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:503)
at android.database.sqlite.SQLiteConnectionPool.tryAcquireNonPrimaryConnectionLocked(SQLiteConnectionPool.java:987)
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:693)
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:378)
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:586)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1383)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query(FrameworkSQLiteDatabase.java:161)
at androidx.room.RoomDatabase.query(RoomDatabase.java:328)
at androidx.room.util.DBUtil.query(DBUtil.java:83)
at androidx.work.impl.model.PreferenceDao_Impl.getLongValue(PreferenceDao_Impl.java:70)
at androidx.work.impl.utils.PreferenceUtils.getNeedsReschedule(PreferenceUtils.java:96)
at androidx.work.impl.utils.ForceStopRunnable.shouldRescheduleWorkers(ForceStopRunnable.java:187)
at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:88)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
at java.lang.Thread.run(Thread.java:764) 

如果我从 Application#onCreate 中移出将我的工作排入队列的代码进入应用程序生命周期的后期阶段(例如某些 Activity ),它就不会失败。

我没有发现从 Application#onCreate 排队工作的任何限制所以我希望它必须工作。
我正在使用 WorkManager 2.3.4 和 Room 2.2.5。我尝试将 Room 降级到 2.2.2,并将 WorkManager 降级到几个较旧的稳定版本,但没有帮助。问题可在具有不同 Android 版本的不同设备和模拟器上重现。

如何解决此问题并继续在 Application#onCreate 中排队工作?

编辑
这是我如何排队工作:
workManagerProvider.get().enqueueUniquePeriodicWork(
"Unique name",
ExistingPeriodicWorkPolicy.REPLACE,
request
)

在哪里 workManagerProviderProvider<WorkManager> .由于循环依赖,我无法直接访问 workmanager,所以我必须从 dagger 获取提供程序,然后才能使用它。它与主题无关。

最佳答案

该问题是由另一段代码引起的,该代码在首次启动时删除了应用程序的内部数据。删除是与 WorkManager 并行执行的。的内部数据库创建。因此,在初始化期间 WorkManager试图访问已删除的数据库文件的 SQLite 连接并导致崩溃。

关于android - WorkManager 在尝试将唯一的周期性工作排入 Application#onCreate 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61910397/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com