我按照官方指南使用 WorkManager(Kotlin 版本)设置了一个长时间运行的工作线程。现在我需要用操作进度更新通知。文档说:
// 当需要更新 // 正在进行的通知时定期调用 setForegroundInfo()
但是我找不到任何 setForegroundInfo() 方法。那么如何更新正在进行的通知呢?
我正在尝试设置工作管理器来完成一些工作,但在初始化时遇到问题。我正在使用 KOIN workmaanger dsl
implementation "org.koin:koin-androidx-workmanager:2.2.0-rc-4"
Run Code Online (Sandbox Code Playgroud)
我的工人阶级看起来像这样
class NotificationsScheduler(
private val dispatchers: AppCoroutineDispatchers,
private val getTaskUseCase: GetTaskUseCase,
private val context: Context,
private val workerParameters: WorkerParameters
) : Worker(context, workerParameters) {
override fun doWork(): Result {
...
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的是禁用默认初始化程序
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)
我的工作模块是这样设置的
val workerModule = module {
worker { NotificationsScheduler(get(), get(), get(), get()) }
}
Run Code Online (Sandbox Code Playgroud)
并将其添加到 startKoin DSL 中使用的列表中。我还使用 workManagerFactory() DSL 来设置工厂。
startKoin {
androidContext(this@MyApplication)
workManagerFactory()
modules(koinModules)
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当应用程序因异常启动时它会崩溃:
Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'androidx.work.WorkerParameters'. Check …Run Code Online (Sandbox Code Playgroud) 我正在研究 Hilt 在我当前的 Android 应用程序中的使用。
api 'androidx.hilt:hilt-work:1.0.0-alpha02'
implementation "com.google.dagger:hilt-android:2.30.1-alpha"
kapt 'com.google.dagger:hilt-android-compiler:2.30.1-alpha'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
api "androidx.work:work-runtime:2.4.0"
implementation "androidx.work:work-runtime-ktx:2.4.0"
testImplementation "androidx.work:work-testing:2.4.0"
testImplementation 'com.google.dagger:hilt-android-testing:2.30.1-alpha'
kaptTest 'com.google.dagger:hilt-android-compiler:2.30.1-alpha'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.7"
testImplementation "androidx.arch.core:core-testing:2.1.0"
testImplementation "junit:junit:4.13.1"
testImplementation "org.robolectric:robolectric:4.4"
testImplementation 'io.mockk:mockk:1.10.3'
testImplementation "androidx.test:core:1.3.0"
testImplementation "androidx.test.ext:junit:1.1.2"
Run Code Online (Sandbox Code Playgroud)
但我无法让我的androidx.work.CoroutineWorkerUnitTest 运行。
他们失败了,但有一个例外:-
java.lang.IllegalStateException: Could not create an instance of ListenableWorker com.my.manager.background.work.worker.MyWorker
at androidx.work.testing.TestListenableWorkerBuilder.build(TestListenableWorkerBuilder.java:361)
at com.my.manager.background.work.ApplicationFeaturesWorkerTest.testApplicationFeaturesWorker(MyWorkerTest.kt:13)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) …Run Code Online (Sandbox Code Playgroud) 我正在使用 Android WorkManager 创建一个 React Native 后台同步任务。WorkManager 类中的 doWork 方法被定期、正确地调用。我面临的问题是如何从 doWork 方法调用 React Native 函数。在我当前的实现中,未调用 JavaScript 函数。
React Native 中的无头任务
// index.js
AppRegistry.registerHeadlessTask('SyncHeadlessTask', () => SyncHeadlessTask);
// SyncHeadlessTask.js
module.exports = async (taskData) => {
console.log('task running');
};
Run Code Online (Sandbox Code Playgroud)
我的 Java 中的 HeadlessTask
public class SyncHeadlessTaskService extends HeadlessJsTaskService {
@Override
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
return new HeadlessJsTaskConfig(
"SyncHeadlessTask",
Arguments.fromBundle(extras),
10000, // timeout for the task
true // optional: defines whether or …Run Code Online (Sandbox Code Playgroud) 当我使用WorkManager并尝试将一些对象传递给它时
Data data = new Data.Builder().put("passstring",object).build();
Run Code Online (Sandbox Code Playgroud)
获取Builder.put 只能从同一个库组 (groupId=androidx.work) 中调用 错误
我想将 WorkManager 与 Hilt 一起使用。我按照文档并将所需的依赖项集成到我的 gradle 文件中:
// WorkManager library
implementation "androidx.work:work-runtime-ktx:$work_version"
// To use WorkManager with Hilt
implementation "androidx.hilt:hilt-work:workmanager_hilt_version"
// Annotation processor when using Kotlin
kapt "androidx.hilt:hilt-compiler:workmanager_hilt_version"
Run Code Online (Sandbox Code Playgroud)
请注意,版本是work_version = "2.5.0"和workmanager_hilt_version = "1.0.0-beta01"。
然后我转到我的 Worker 类并按照@HiltWorker文档中的描述输入,但 Android Studio 找不到它:
@HiltWorker
class RefreshDataWorker @AssistedInject constructor(@Assisted appContext: Context, @Assisted params: WorkerParameters): CoroutineWorker(appContext, params) { ...// some doWork() stuff }
Run Code Online (Sandbox Code Playgroud)
@HiltWorker是红色字母,Android Studio 找不到它。为什么 ?做某事。希尔特发生了变化?有没有什么。文档中缺少?
我希望有人能帮帮忙。
我正在尝试 Android WorkManager,它每 15 分钟就会成功触发一次。
但是,工作尚未完成,我在日志中收到此错误。
I/WM-WorkerWrapper: Worker result FAILURE for Work
这就是我设置Constraints(在应用程序类内部)来触发工作的方式。
//set-up work
private fun setUpAsteroidLoadingWork() {
//define work constraints
val workConstraints =
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(false)
.build()
//create WorkRequest
val workRequest = PeriodicWorkRequestBuilder<LoadAsteroidsWorker>(15, TimeUnit.MINUTES)
.setConstraints(
workConstraints)
.build()
//get WorkManager
val workManager = WorkManager.getInstance(this)
//enqueue work
workManager.enqueueUniquePeriodicWork(
LoadAsteroidsWorker.WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)
}
Run Code Online (Sandbox Code Playgroud)
onCreate()我在应用程序类方法中开始工作
override fun onCreate() {
super.onCreate()
//initialize Timber
Timber.plant(Timber.DebugTree())
Timber.i("Application's onCreate Called")
//start work inside onCreate
runWorkInBackground()
}
//switch work to run on background
private …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 WorkManager 与 Hilt 一起注入。首先我实现文档:
使用类中的 @HiltWorker 注释和 Worker 对象的构造函数中的 @AssistedInject 注入 Worker。您只能在 Worker 对象中使用 @Singleton 或无范围绑定。您还必须使用 @Assisted 注释 Context 和 WorkerParameters 依赖项:
@HiltWorker
class RetreiveQuestionWorkManager @AssistedInject constructor(
@Assisted val appContext : Context,
@Assisted val workerParameters: WorkerParameters,
val questionDao: QuestionDao,
val questionCacheMapper: QuestionCacheMapper)
: CoroutineWorker(appContext, workerParameters) {
...
}
Run Code Online (Sandbox Code Playgroud)
然后我从文档中应用了这个:
然后,让您的 Application 类实现 Configuration.Provider 接口,注入 HiltWorkFactory 的实例,并将其传递到 WorkManager 配置中,如下所示:
@HiltAndroidApp
class MyApp : Application(), Configuration.Provider {
@Inject lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
Run Code Online (Sandbox Code Playgroud)
最后,我处理文档中的这条注释: …
我正在开发一个应用程序,我必须从多个传感器读取数据并每 15 分钟将其发送到远程服务器。这也必须在应用程序关闭/终止时完成,并且我还必须确保它始终执行。我还想确保它(几乎)恰好每 15 分钟发生一次(+-1 分钟差异是上限)。
此时,我找到了 3 个选项:使用 Workmanager、Alarmmanager 或使用前台服务。按照文档,Workmanager 似乎是执行后台任务的方法,但是,在阅读了一些内容之后,Alarmmanager 似乎是一个更安全的选择(Workmanager 有时在打瞌睡模式方面存在问题,并且时间不准确,因为它使用了 Flex持续时间至少 5 分钟)。前台服务实际上不允许执行此类任务(它并不是真正长时间运行,它只是一个周期性任务),并且在较新的 Android 版本中受到限制。您认为使用 Alarmmanger 来完成此任务是个好主意,还是应该使用其他东西?谢谢!
android android-alarms android-background android-workmanager
这个问题已经以不同的形式被问过很多次了,但我没有得到正确的答案,并且想知道它是否可能不是一个 android bug。
设置 WorkManager 后,会随机调用 doWork(),有时会快速连续调用多达 10 次以上。
预期行为是每 10-15 分钟调用一次
请参阅下面的详细信息:使用 Android studio Bumblebee 2021.1.1 Patch 2 在 LG K22 上实现
梯度实现:
implementation 'androidx.work:work-runtime-ktx:2.7.1'
Run Code Online (Sandbox Code Playgroud)
主要活动代码:
WorkManager.getInstance(this).cancelAllWorkByTag("scanDevices")
val myMonitorWorkerRequest = PeriodicWorkRequest.Builder(myMonitorWorker::class.java,
15, TimeUnit.MINUTES,5, TimeUnit.MINUTES).build()
WorkManager.getInstance(this)
.enqueueUniquePeriodicWork(
"scanDevices",
ExistingPeriodicWorkPolicy.KEEP,
myMonitorWorkerRequest)
Run Code Online (Sandbox Code Playgroud)
原始工人阶级:
override fun doWork(): Result {
try{
runNotificationService()
return Result.success()
}
catch (e:Exception){
return Result.failure()
}
}
Run Code Online (Sandbox Code Playgroud)
当前工人阶级:
override fun doWork(): Result {
try{
val timeNow = System.currentTimeMillis()
if(timeNow …Run Code Online (Sandbox Code Playgroud) android ×10
dagger-hilt ×3
kotlin ×2
junit4 ×1
koin ×1
react-native ×1
robolectric ×1
service ×1