Android 定期工作请求状态停留在 Enqueued

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序,以便在到达本地数据库中存储的日期时发送通知。为此,我尝试使用定期工作请求,该请求将调用一个函数来将存储的日期与当前日期进行比较,并在到达该日期时通知用户。但是,当检查后台任务检查器时,我的 Worker 永久处于“排队”状态并且从不运行此功能,我不确定为什么。

在 MainActivity.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() 永远不会被调用。我不确定什么会阻止此方法运行。

这是检查员的视图。我发现我有一个需要网络连接的约束,我也不确定为什么会出现这种情况,因为我删除了设置该约束的代码并重新运行了应用程序。不管怎样,我的模拟设备连接到网络,所以我认为这不应该是一个问题。

后台任务检查器输出

如有任何帮助,我们将不胜感激。谢谢。

android kotlin mobile android-workmanager
1个回答
0
投票

“暂时设置为 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分钟。

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

PeriodicWorkRequest 的正常生命周期是 ENQUEUED -> RUNNING -> ENQUEUED

© www.soinside.com 2019 - 2024. All rights reserved.