标签: android-workmanager

WorkManager 向 JobScheduler 添加了太多作业

我正在尝试使用 安排任务在特定时间运行WorkManager。我之所以使用它beginUniqueWork,是因为我只想为该特定 ID (uniqueWorkName) 一次安排一项任务。但enqueue多次调用后,有时会出现以下错误:

java.lang.IllegalStateException: Apps may not schedule more than 100 distinct jobs
    at android.os.Parcel.readException(Parcel.java:2012)
    at android.os.Parcel.readException(Parcel.java:1950)
    at android.app.job.IJobScheduler$Stub$Proxy.schedule(IJobScheduler.java:180)
    at android.app.JobSchedulerImpl.schedule(JobSchedulerImpl.java:44)
    at androidx.work.impl.background.systemjob.SystemJobScheduler.scheduleInternal(SystemJobScheduler.java:85)
    at androidx.work.impl.background.systemjob.SystemJobScheduler.schedule(SystemJobScheduler.java:64)
    at androidx.work.impl.Schedulers.scheduleInternal(Schedulers.java:98)
    at androidx.work.impl.Schedulers.schedule(Schedulers.java:69)
    at androidx.work.impl.WorkManagerImpl.rescheduleEligibleWork(WorkManagerImpl.java:398)
    at androidx.work.impl.utils.ForceStopRunnable.run(ForceStopRunnable.java:66)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

当我在 every 之后使用以下代码片段记录待处理作业的数量时enqueue,我注意到每次调用都会有 3 个新作业添加到列表中(虽然我预计总数会保持在 1)。

JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
int size = jobScheduler.getAllPendingJobs().size();
Run Code Online (Sandbox Code Playgroud)

这是我用来安排任务的代码:

val work = OneTimeWorkRequest.Builder(workerClass)
        .setInitialDelay(offset, TimeUnit.MILLISECONDS)
        .build()
WorkManager.getInstance()
        .beginUniqueWork(uniqueNameForTask, ExistingWorkPolicy.REPLACE, work)
        .enqueue()
Run Code Online (Sandbox Code Playgroud)

这里看起来有什么不对劲吗?我缺少什么?

android android-jobscheduler android-jetpack android-workmanager

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

WorkManagerPeriodicWorkRequest 运行两次

我有一个每 15 分钟运行一次数据库刷新的应用程序。

periodicworkrequest 在我的主要活动的 onCreate 中排队。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    updateDatabasePeriodically();


public void updateDatabasePeriodically() {
    PeriodicWorkRequest updateDatabaseRequest =
            new PeriodicWorkRequest.Builder(UpdateDatabaseWorker.class, 15, TimeUnit.MINUTES).build();

    WorkManager.getInstance(getMainActivityContext()).enqueue(updateDatabaseRequest);
}
Run Code Online (Sandbox Code Playgroud)

更新数据库工作人员:

@Override
public Result doWork() {
    // Do the work here--in this case, upload the images.


    updateDatabase();
    // Indicate whether the task finished successfully with the Result
    return Result.success();
}

private void updateDatabase() {
    AppDatabase appDatabase = AppDatabase.getInstance(context);

    Log.i(TAG, "Updating alerts at: " + DateTimeHelper.getHumanReadableTime(now));
}
Run Code Online (Sandbox Code Playgroud)

问题是每次作业执行时都会完成两次工作,如我的日志语句所示

2019-11-22 10:20:23.185 24987-25085/com.package.myapp I/com.package.myapp.UpdateDatabaseWorker: Updating …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

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

在 Android 8+ 上停止应用程序时会终止定期任务

大家好,我正在尝试在 Android 上实现定期任务,但我被困在某些设备上。

我需要每 15 或 30 分钟在后台运行一次任务。这在 Android 8.0 之前的版本上运行良好。但在 8+ 上,它仅在应用程序处于后台或前台时才有效。当应用程序从最近的应用程序中滑出时,计划任务在真实设备(Ulefone note 7(Android 8.1)、Tecno LC7(Android 10)、itel A56(Abdroid 9))上被终止,但在模拟器(Android 10)上运行良好。我尝试了几种方法:

1.Workmanager(仅当应用程序处于后台或前台时才工作)

构建.gradle

implementation "androidx.work:work-runtime:2.4.0"
Run Code Online (Sandbox Code Playgroud)

主要活动

PeriodicWorkRequest periodicSyncDataWork =
                    new PeriodicWorkRequest.Builder(NotificationWorker.class, 15,TimeUnit.MINUTES)
                            .addTag("TAG_SYNC_DATA")
                            .setBackoffCriteria(BackoffPolicy.LINEAR,PeriodicWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
                            .build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
                    "NOTIFICATION_WORKER",
                    ExistingPeriodicWorkPolicy.REPLACE, //Existing Periodic Work policy
                     periodicSyncDataWork //work request
            );
Run Code Online (Sandbox Code Playgroud)

通知工作者

public class NotificationWorker extends Worker {
public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) 
{
    super(context, workerParams);
}


@NonNull
@Override
public Result doWork() {
    Log.d("MYWORKER", "LLLLLLLLLLL");
    //My code here
    return Result.success();
}
Run Code Online (Sandbox Code Playgroud)

} …

android alarmmanager periodic-task android-jobscheduler android-workmanager

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

无法使用 Hilt 注入 workmanager 构造函数

我正在开发一个 Android 应用程序。我正在尝试将 hilt 与 workmanager 构造函数一起使用,但它不起作用并给了我这个错误:

2020-08-18 19:01:09.989 18125-18759/com. E/WM-WorkerFactory: Could not instantiate example.android.app.database.DeleteNotesWorker
    java.lang.NoSuchMethodException: example.android.app.database.DeleteNotesWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
        at java.lang.Class.getConstructor0(Class.java:2328)
        at java.lang.Class.getDeclaredConstructor(Class.java:2167)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:242)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136)
        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)

这是工人阶级:

class DeleteNotesWorker @WorkerInject constructor(
    @Assisted context: Context,
    @Assisted workerParams: WorkerParameters,
    private val dao : NotesDao
) : CoroutineWorker(context, workerParams) {

    override suspend fun doWork(): Result {
        dao.deleteNotesInTrash()
         return Result.success()
    }


}
Run Code Online (Sandbox Code Playgroud)

应用模块:

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection android-workmanager dagger-hilt

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

找不到 com.google.common.util.concurrent.ListenableFuture 的 Android Studio 类文件

我无法构建我的项目,因为它失败了,因为它找不到类。我的 SDK 或依赖项有问题吗?

我试过使缓存无效并重新启动。我正在使用 api 29。

以下是错误出现的地方

public class PodcastUpdateWorker extends Worker {

}
Run Code Online (Sandbox Code Playgroud)

这是错误打印输出

/home/snowman/AndroidStudioProjects/CorbettReportPodcasts/app/src/main/java/com/example/corbettreportpodcasts/PodcastUpdateWorker.java:36: error: cannot access ListenableFuture
public class PodcastUpdateWorker extends Worker {
       ^
  class file for com.google.common.util.concurrent.ListenableFuture not found
Run Code Online (Sandbox Code Playgroud)

和我的依赖

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'com.google.android.exoplayer:exoplayer-core:2.12.0'
    implementation 'com.google.android.exoplayer:exoplayer-dash:2.12.0'
    implementation 'com.google.android.exoplayer:exoplayer-ui:2.12.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
    implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
    implementation "androidx.room:room-runtime:2.2.5"
    annotationProcessor "androidx.room:room-compiler:2.2.5"
    testImplementation "androidx.room:room-testing:2.2.5"
    implementation 'androidx.work:work-runtime:2.4.0'
    implementation 'com.google.android.material:material:1.2.1'
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

java android android-workmanager

1
推荐指数
2
解决办法
1956
查看次数

用于重复后台工作的警报管理器或工作管理器

我无法决定是否使用警报管理器或工作管理器运行一些重复的后台工作:

  • 这项工作将包括房间数据库操作,因此我需要访问 Dao 来完成我的工作。
  • 它将以固定的时间间隔重复出现(每小时、每天、每周、每月等)
  • 我需要设置重复间隔的开始日期和时间。
  • 该工作将重复进行,直到用户取消为止
  • 如果用户在应该安排工作时使用该应用程序,我希望立即完成工作。如果用户不在应用程序上(应用程序在后台或设备已关闭),我不在乎工作是否在预定时间之后完成,只要它至少在用户下次打开时启动即可该应用程序。
  • 设备重新启动和应用程序重新启动后,工作需要按计划继续。

android alarmmanager android-room android-workmanager

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

Android:如何处理WorkManager Rx 的结果?

我正在使用 WorkManager (Android Jetpack) 和 Rx 开发一个 Android 应用程序。下面是 Worker 类。

class ImageRxWorker(
    appContext: Context,
    private val workerParams: WorkerParameters
) : RxWorker(appContext, workerParams) {

    override fun createWork(): Single<Result> = Single.create<Result> { emitter -

        // do the job

        emitter.onSuccess(Result.success())
    }

}
Run Code Online (Sandbox Code Playgroud)

它工作正常,没有问题。但我想知道的是我该如何处理结果?

class MainPresenter(
    private val view: MainActivity,
    private val workManager: WorkManager = WorkManager.getInstance()
) : MainContract.Presenter {

    override fun startWork(): Completable {
        view.showToastMessage(R.string.worker_started)

        return Completable.create { emitter ->
            val uploadWorkRequest = OneTimeWorkRequestBuilder<ImageRxWorker>().build()
            workManager.enqueue(uploadWorkRequest)
            emitter.onComplete() // This is not exit immediately. …
Run Code Online (Sandbox Code Playgroud)

android kotlin rx-java rx-java2 android-workmanager

-1
推荐指数
1
解决办法
3399
查看次数