我正在开发一个Android应用程序,用于在到达本地数据库中存储的日期时发送通知.为此,我try 使用定期工作请求,该请求将调用一个函数将存储的日期与当前日期进行比较,并通知用户是否已到达该日期.然而,当判断后台任务判断器时,我的工作人员永久处于"排队"状态,并且从不运行此功能,我不确定原因.

在MainActive.kt的OnCreate()方法中创建工作请求:

class MainActivity : ComponentActivity() {
    @RequiresApi(Build.VERSION_CODES.O)
    override fun onCreate(savedInstanceState: Bundle?) {
        
    //...

        //For WorkManager to manage Notifications
        // Create periodic work request
        val periodicWorkRequest = PeriodicWorkRequestBuilder<EventCheckWorker>(5, TimeUnit.SECONDS) //Temporarily set to 5 sec. for testing
            .build()

        // Enqueue periodic work
        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "EventCheckWorker",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )

    }
}

EventCheckWorker判断是否已到达日期:

class EventCheckWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        Log.d("START doWork", "START doWork")
        return try {
            // Retrieve all events from Assignment
            val assignmentsFlow = AssignmentDatabase.getDatabase(applicationContext).assignmentDao()
                .getAllAssignments()

            val today = Calendar.getInstance().timeInMillis

            runBlocking {
                //Converts Flow<List<Assignment>> into List<Assignment>
                assignmentsFlow.collect { assignments ->
                    // Check if any event date is today. If today, send a notification
                    for (assignment in assignments) {
                        Log.d("Loop doWork", "Loop doWork " + assignment.id.toString())
                        if (assignment.dueDate.time <= today) {
                            sendNotification(applicationContext, assignment.name)
                        }
                    }
                }
            }

            Log.d("SUCCESS doWork", "SUCCESS doWork")
            Result.success()
        } catch (e: Exception) {
            // Log the exception
            Log.e("EventCheckWorker", "Error processing events", e)
            Result.failure()
        }
    }
}

EventCheckWorker中的Log陈述永远不会出现在Logcat中,这意味着doWork()永远不会被调用.我不确定是什么阻止此方法运行.

这是督察的观点.我看到我有一个需要网络连接的限制,我也不确定为什么会出现这种情况,因为我删除了该限制的代码设置并重新运行了应用程序.无论如何,我的模拟设备is连接到网络,所以我认为这应该不是问题.

Background Task Inspector output

我还try 等待至少15分钟的时间间隔来等待定期请求发生,但该功能再次没有运行.

对此我们将不胜感激.谢谢

推荐答案

"暂时设置为5秒."用于测试"将被忽略,工作请求期间的最低时间为15分钟.

https://android.googlesource.com/platform/frameworks/support/+/androidx-1.0-dev/work/workmanager/src/main/java/androidx/work/PeriodicWorkRequest.java#34

以及从docs

定期工作至少间隔15分钟.

因此,您可能错过了请求的第一次立即运行,并且随着生命周期的进行,没有等待足够的时间来等待下一个请求:-

周期工作请求的正常生命周期是ENQUEUED -RUNNING -ENQUEUED

或者,当您指定"DeliverstingPeriodicWorkPolicy.KEEP"时,因为您可能已经有一个实例排队,因此不会添加新实例,请使用CANCEL_AND_REENQUEUE或GROUP.

Android相关问答推荐

具有数据类的LiveData不会在视图模型中更新

我遇到了一个HashMaps对象没有存储在Firebase数据库中的问题.HashMap的一个对象put方法未被存储

房间DB:UPSERT返回什么?

ERR_SSL_VERSION_OR_CIPHER_MISMATCH - Android Webview

在Jetpack Compose中将导航绘图显示在顶部栏下方、底部栏上方

如何在Jetpack Compose中实现前后动画?

没有打开历史记录的活动意向 Select 器完成调用活动

为什么 Android Compose 将片段作为参数传递给 Composables 函数?

弹出导航堆栈后,Compose 无法访问 Hilt View Model

为什么我的 APK 中包含来自旧版 Android 支持库的类?

Android Compose 为什么 Checkbox 在父对象可点击时需要 onCheckChanged?

如何将可重用的 ExtendedFloatingActionButton 与可重用的脚手架链接起来

每次在 Jetpack Compose 中调用导航

是否可以在 Kotlin 中为 mutableStateOf() 设置自定义设置器

如何解决 compose 中material 图标的由于接收器类型不匹配,以下候选者都不适用

如何在 BasicTextField 中全选焦点

react 从输入中找到路径'lib/arm64-v8a/libfbjni.so'的本机2个文件

无法为:app@debug/compileClasspath解析依赖项com.github.dhaval2404:imagepicker-support:1.7.1

如何在 TextInputEdit 中调整可绘制对象的大小

房间实时数据:启动时崩溃