我已经按照Android开发人员的教程使用工作管理器结构在后台运行我的代码,但是当我尝试将我的工作人员排队时它不会运行,我收到以下错误:
2018-10-04 22:25:47.004 28669-28885/app.package.com.debug E/DefaultWorkerFactory: Could not instantiate app.package.com.MyWorker
java.lang.NoSuchMethodException: <init> []
at java.lang.Class.getConstructor0(Class.java:2320)
at java.lang.Class.getDeclaredConstructor(Class.java:2166)
at androidx.work.DefaultWorkerFactory.createWorker(DefaultWorkerFactory.java:58)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:180)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:117)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
2018-10-04 22:25:47.005 28669-28885/app.package.com.debug E/WorkerWrapper: Could for create Worker app.package.com.MyWorker
Run Code Online (Sandbox Code Playgroud)
我已经看到这个问题可能与worker上的默认构造函数有关但我已经使用了正确的构造函数而不是不推荐使用的默认函数.
我的工人被宣布为:
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// Doesn't even get called
}
}
Run Code Online (Sandbox Code Playgroud)
它就像这样排队:
WorkManager workManager = WorkManager.getInstance();
if (myWorkerRequest == null) …Run Code Online (Sandbox Code Playgroud) 我的应用程序中安排了两个定期工作人员,其中一个工作人员在 24 小时后重复,另一个在 15 分钟后重复。
最初在全新安装时,事情按预期工作,但几天后我在 2 台设备上遇到了问题(共 5 台)。24 小时工人被正确触发,但 15 分钟工人根本没有被触发。我现在已经监视了 24 小时。
我通过 Stetho 查看了 workmanager 的数据库,看到了一些 24 小时工人的条目和 15 分钟工人的 0 个条目。我在WorkSpec桌子上找。
我通过 Android Studio 进行了调试,在使用 WorkManager 查询之后,getWorkInfosByTag()我得到了 15 分钟工作人员的 80 个对象列表,其中 79 个处于CANCELED状态,一个处于ENQUEUED状态。
很明显,取消的工人没有添加到数据库中?
我没有找到任何来自谷歌的文件来解释工人被取消的情况。
我正在使用1.0.0-beta03工作运行时的版本。此外,我没有杀死应用程序或做任何有趣的事情。该应用程序在后台运行,并没有被杀死。设备为小米 A2 (Android 9)、红米 Note 4(Android 7)。
我需要了解为什么工人被取消了,有没有更好的方法来调试这个?任何指针都会有所帮助和赞成!
谢谢。
Edit1:发布代码以安排两个工作人员。
24小时定期工:
public static synchronized void scheduleWork() {
checkPreviousWorkerStatus();
if (isWorking()) {
Log.i("AppDataCleanupWorker", "Did not schedule data cleanup work; already running."); …Run Code Online (Sandbox Code Playgroud) 我有这样的代码,我需要实现任务队列,如果任务在队列中,那么你不需要添加它。\n我实现如图所示,一切正常,但有时工作人员的状态保持ENQUEUED ,并且新的任务不会添加到队列中。\n也就是说,当没有互联网时,我添加一个任务,当互联网出现时,任务开始耗尽,但由于某些原因,有时不会\xe2\x80\ x99t 发生,我无法\xe2\x80\x99 理解为什么任务没有启动,尽管事实上有互联网并且任务在队列中。\n你如何确定为什么任务不会启动?\n有人知道吗?有更好的建议吗?
\n\n//run task\nrunOneTimeWorkByType<GetDocumentsWorker>(GET_DOCUMENTS_TAG)\n\n private inline fun <reified W : Worker> runOneTimeWorkByType(tag: String) {\n val workerInfoList = workManager\n .getWorkInfosByTag(tag)\n .get()\n\n for (item in workerInfoList) {\n if (item.state == WorkInfo.State.ENQUEUED){\n return\n }\n }\n\n val constraints = Constraints.Builder()\n .setRequiredNetworkType(NetworkType.CONNECTED)\n .build()\n\n val workRequest =\n OneTimeWorkRequestBuilder<W>()\n .setConstraints(constraints)\n .addTag(tag)\n .build()\n\n workManager.enqueue(workRequest)\n }\n\n\n class GetDocumentsWorker(ctx: Context, workerParams: WorkerParameters) :\n Worker(ctx, workerParams) {\n @Inject\n lateinit var serviceUtils: ServiceUtils\n\n init {\n App.appComponent.inject(this)\n }\n\n override fun doWork(): Result {\n Log.d("workmng", "GetDocumentsWorker: start")\n try {\n serviceUtils.documentsGet()\n …Run Code Online (Sandbox Code Playgroud) 我正在创建具有NetworkType.CONNECTED约束的OneTimeWorkRequest,但是即使设备已连接到Internet,请求仍处于“已排队”状态
Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(SyncWorker.class)
.setConstraints(constraints)
.build();
WorkContinuation continuation = mWorkManager.beginUniqueWork("work",
ExistingWorkPolicy.KEEP, request);
continuation.enqueue();
Run Code Online (Sandbox Code Playgroud)