如何检查是否WorkManager已安排.
这是我安排的代码WorkManager.
public static void scheduleWork() {
PeriodicWorkRequest.Builder photoCheckBuilder =
new PeriodicWorkRequest.Builder(WorkManagerService.class, TIME_INTERVAL_IN_SECONDS,
TimeUnit.SECONDS);
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
WorkManager instance = WorkManager.getInstance();
if (instance != null) {
instance.enqueueUniquePeriodicWork("TAG", ExistingPeriodicWorkPolicy.KEEP , photoCheckWork);
}
}
Run Code Online (Sandbox Code Playgroud)
我把scheduleWork()在onCreate()我的Application课.即使我可以通过这种方法检查我的服务是否正在运行.但我不希望安排WorkManager,如果它已经安排在计划时间内删除不一致.
喜欢
if(!workManagerIsScheduled())
{
scheduleWork();
}
Run Code Online (Sandbox Code Playgroud)
有解决方案吗
我想在应用程序启动时从服务器下载某些文件。所以我尝试使用工作管理器,它从我的自定义应用程序类中排队。但是 Worker 类没有被触发,状态只是入队,不会进入运行状态.下面是我的代码:
应用类:
@Override
public void onCreate() {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
//.setRequiresStorageNotLow(true)
//.setRequiresBatteryNotLow(true)
.build();
OneTimeWorkRequest request = new OneTimeWorkRequest
.Builder(MyWorker.class)
//.setConstraints(constraints)
//.setInitialDelay(1,TimeUnit.SECONDS)
.addTag("download")
.build();
WorkManager.getInstance(getApplicationContext()).getWorkInfoByIdLiveData(request.getId()).observeForever(new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if (workInfo == null) {
Log.d("download", "workInfo == null");
} else {
Log.d("download", "workInfo != null: " + workInfo.getState().toString());//This is giving ENQUEUED once..thats it
}
}
});
WorkManager.getInstance(getApplicationContext()).enqueue(request);
}
Run Code Online (Sandbox Code Playgroud)
我的工人类
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull …Run Code Online (Sandbox Code Playgroud) 我目前正在使用CoroutineWorkerfrom androidx.work:work-runtime-ktx:2.5.0.
我想要实现的是:
beginUniqueWork和相同uniqueWorkName,与政策ExistingWorkPolicy.APPEND_OR_REPLACE。如果存在失败或取消的先决条件,则这些先决条件将被删除,新指定的工作将成为新序列的开始。
发生的情况是,如果前一个工作人员也被取消(或失败),则所有或排队的工作人员都会被取消。ExistingWorkPolicy.APPEND这应该是but not的预期行为ExistingWorkPolicy.APPEND_OR_REPLACE。
有什么想法为什么会发生这种情况吗?如何避免排队的唯一工作人员也被取消?
如何从 Android WorkManager 更新 UI。
Android Workmanager可以接收Boolean、Integer、Long、Float、Double、String
文档说:
public Data.Builder putAll (Map<String, Object> values)
Run Code Online (Sandbox Code Playgroud)
“将所有输入键值对放入生成器中。有效类型包括:Boolean、Integer、Long、Float、Double、String 以及每种类型的数组版本。无效类型会引发 IllegalArgumentException。”
Result.SUCCESS 或 Result.FAILURE 不是解决方案,因为只有在工作完成时才会返回。
val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
"FOO",
ExistingPeriodicWorkPolicy.REPLACE,
request
)
Run Code Online (Sandbox Code Playgroud)
上面的代码是在RANonCreate的Application,以确保该请求被排入队列。但是,这会导致一个问题,即FooWorker每次用户启动应用程序时都会运行,因为ExistingPeriodicWorkPolicy.REPLACE取消以前的工作并将新工作加入队列,导致它立即运行。
如果我们更改为ExistingPeriodicWorkPolicy.KEEP,即使期间或工作人员更改,我们也无法替换工作。
有没有办法在当前运行后替换请求?
例如,原始请求每天运行 1 次,新请求每小时运行 1 次。运行下一个原始请求后,将其替换为新请求。
我最近将旧应用程序的后台服务迁移到WorkManager。在最近的设备上(包括 sdk 22),它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。
问题是当我针对旧版本(旧在这里非常相关)进行测试时,Android sdk 14 是我的minSdkVersion. 顺便说一句,也WorkManager应该有相同的:根据doc向后兼容 API 14。如标题所述,我得到的错误是:
java.lang.RuntimeException: Unable to get provider androidx.work.impl.WorkManagerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: /data/app/com.example.myapp.apk
at android.app.ActivityThread.installProvider(ActivityThread.java:4822)
Run Code Online (Sandbox Code Playgroud)
我没有任何自定义 WorkManager 配置/初始化,我只是添加了
implementation 'androidx.work:work-runtime:2.2.0'
Run Code Online (Sandbox Code Playgroud)
到我的模块的 gradle 并非常典型地使用它来安排后台操作。
我们有一个 Android 应用程序,使用 WorkManager 来处理后台同步工作。我们的同步工作者是这样的:
public class SyncWorker extends Worker {
[...]
@NonNull
@Override
public Result doWork() {
if (canNotRetry(getRunAttemptCount())) {
// This could seem unreachable, consider removing... or not... because if stopped by the
// system, the work might be retried by design
CBlogger.INSTANCE.log([...]);
return Result.success();
}
boolean syncOk = false;
//Sync
try (Realm realm = Realm.getDefaultInstance()) {
// Doing sync related ops & network calls
// checking this.isStopped() between operations to quit
// sync activity when worker has …Run Code Online (Sandbox Code Playgroud) Work [ id=ab50e634-d315-4566-acc2-fe146a7366e2, tags={ in.offline.usecase.Upload****s$Worker, upload/***/now/* } ] was cancelled
java.util.concurrent.CancellationException: Task was cancelled.
at androidx.work.impl.utils.futures.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1184)
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:514)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:284)
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)
Run Code Online (Sandbox Code Playgroud)
为什么工作管理器开发人员无法显示取消的原因,这个问题已经存在一年左右了,他们正在提供前台支持,但没有解决基本问题。
我正在使用 ListenableWorker 来执行后台任务。我也希望操作系统意识到我的服务重要性,所以我打电话
setForegroundAsync(new ForegroundInfo(WorkerConstants.NOTIFICATION_FOREGROUND_ID,
builder.build()));
Run Code Online (Sandbox Code Playgroud)
正如谷歌文档中所建议的那样。
但是当我的服务停止或取消时,我仍然可以看到前台服务通知并且我无法删除它。
此外,我在此通知中添加了取消按钮,但它什么也没做,我无法关闭它:
PendingIntent intent = WorkManager.getInstance(getApplicationContext())
.createCancelPendingIntent(getId());
builder.addAction(R.drawable.ic_redesign_exit,"Stop",intent);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
在这里做一些Jeopardy 风格的问答。
我有一些工作有时需要按照2.7.0 版本中所述的方式快速运行:WorkManager
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED).build()
val oneTimeWorkRequest = OneTimeWorkRequest.Builder(MyWorker::class.java)
.setInitialDelay(2, TimeUnit.SECONDS)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.setConstraints(constraints).build()
WorkManager.getInstance(context).enqueueUniqueWork("my-identifier", ExistingWorkPolicy.REPLACE, oneTimeWorkRequest)
Run Code Online (Sandbox Code Playgroud)
我相信代码在 Android 12/S 上运行得很好,但是当作业在 Android 11 上运行时,我收到以下错误:
E/WM-WorkerWrapper: Work [ id=<UUID>, tags={ [WorkerTag] } ] failed because it threw an exception/error
java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Expedited WorkRequests require a ListenableWorker to provide an implementation for `getForegroundInfoAsync()`
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:311)
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:923)
Run Code Online (Sandbox Code Playgroud)
我需要做什么?