标签: android-workmanager

检查是否已安排WorkManager

如何检查是否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)

有解决方案吗

android android-workmanager

9
推荐指数
3
解决办法
7161
查看次数

Android WorkManager 未启动工作线程

我想在应用程序启动时从服务器下载某些文件。所以我尝试使用工作管理器,它从我的自定义应用程序类中排队。但是 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)

android workmanagers android-workmanager androidx

9
推荐指数
0
解决办法
5755
查看次数

WorkManager 现有工作策略 APPEND_OR_REPLACE 未按预期运行

我目前正在使用CoroutineWorkerfrom androidx.work:work-runtime-ktx:2.5.0.

我想要实现的是:

  1. 入队工人与beginUniqueWork和相同uniqueWorkName,与政策ExistingWorkPolicy.APPEND_OR_REPLACE
  2. 这将按顺序运行工作人员,如果工作失败或被取消,根据文档,预期行为将

如果存在失败或取消的先决条件,则这些先决条件将被删除,新指定的工作将成为新序列的开始。

发生的情况是,如果前一个工作人员也被取消(或失败),则所有或排队的工作人员都会被取消。ExistingWorkPolicy.APPEND这应该是but not的预期行为ExistingWorkPolicy.APPEND_OR_REPLACE

预期行为 -> 实际行为

有什么想法为什么会发生这种情况吗?如何避免排队的唯一工作人员也被取消?

android android-workmanager

9
推荐指数
1
解决办法
1779
查看次数

从 Workmanager 更新 UI

如何从 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。”

  1. 如何传递更新 UI 的回调。
  2. 如何在不调用 DB 的情况下传递 POJO。

Result.SUCCESS 或 Result.FAILURE 不是解决方案,因为只有在工作完成时才会返回。

android android-jetpack android-workmanager

8
推荐指数
1
解决办法
9548
查看次数

如何更改定期工作请求期间而不使用 WorkManager 立即运行?

val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
    "FOO",
    ExistingPeriodicWorkPolicy.REPLACE,
    request
)
Run Code Online (Sandbox Code Playgroud)

上面的代码是在RANonCreateApplication,以确保该请求被排入队列。但是,这会导致一个问题,即FooWorker每次用户启动应用程序时都会运行,因为ExistingPeriodicWorkPolicy.REPLACE取消以前的工作并将新工作加入队列,导致它立即运行。

如果我们更改为ExistingPeriodicWorkPolicy.KEEP,即使期间或工作人员更改,我们也无法替换工作。

有没有办法在当前运行后替换请求?

例如,原始请求每天运行 1 次,新请求每小时运行 1 次。运行下一个原始请求后,将其替换为新请求。

android kotlin android-workmanager

8
推荐指数
1
解决办法
2661
查看次数

androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data/app/app-2.apk

我最近将旧应用程序的后台服务迁移到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 androidx

8
推荐指数
2
解决办法
2207
查看次数

Android 的 WorkerManager 何时停止 Worker?

我们有一个 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)

android android-workmanager

8
推荐指数
1
解决办法
2303
查看次数

Android Worker 被取消,未显示任何原因

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)

为什么工作管理器开发人员无法显示取消的原因,这个问题已经存在一年左右了,他们正在提供前台支持,但没有解决基本问题。

android android-workmanager

8
推荐指数
1
解决办法
1553
查看次数

ListenableWorker 不会删除通知图标

我正在使用 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)

有什么建议?

android android-notifications android-workmanager

8
推荐指数
1
解决办法
1256
查看次数

加急 WorkRequest 需要 ListenableWorker 提供 getForegroundInfoAsync() 的实现

在这里做一些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)

我需要做什么?

android android-jetpack android-workmanager

8
推荐指数
1
解决办法
4104
查看次数