【问题标题】:Migrate Android Job into Android Work manager将 Android Job 迁移到 Android Work 管理器
【发布时间】:2019-07-30 10:56:56
【问题描述】:

我已经在我的 android 应用程序中实现了 Evernote Android Job。但我想将其更改为 WorkManager。

JobManager.create(this).addJobCreator(new MyJob());

public class MyJob implements JobCreator {
    @Nullable
    @Override
    public Job create(@NonNull String tag) {
        switch (tag) {
            case SyncMasterDataJOB.TAG:
                return new SyncMasterDataJOB();
        }
        return null;
    }
}

职位类别:

public class SyncMasterDataJOB extends Job  {
    public static final String TAG = "job_note_sync";


    @NonNull
    @Override
    protected Result onRunJob(@NonNull Params params) {

        return Result.SUCCESS;
    }


    public static void schedulePeriodic() {
        try{
        new JobRequest.Builder(SyncMasterDataJOB.TAG)                
               .setPeriodic(15*1000, 5*1000)
                .setUpdateCurrent(true)
                .build()
                .schedule();
    } catch (Exception e){
        e.printStackTrace();
    }   

}

如何将 Job 更改为 android workmanager。

【问题讨论】:

  • 嗨,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: android


【解决方案1】:

WorkManager 是高度可配置的,允许您创建PeriodicWorkRequestOneTimeWorkRequest,这些都保证成功。 PeriodicWorkRequest 将在您安排工作以及在计时器中指定时触发。即使应用程序关闭或后台运行,它也会在后台执行。如果您不希望您的任务立即执行,您可以使用带有FlexInterval 的 PWR(PeriodicWorkRequest)。有关详细信息,请参阅下面的文档。

WorkManager Docs

WorkManager Architecture

WorkmManager CodeLab

例如,我创建了两个 PeriodicWorkRequest 来刷新服务并通过更新其令牌来保持用户始终登录。当用户进行身份验证时,PeriodicWorkRequest 被创建。就我而言,我不需要它立即触发,因为他们刚刚接收并缓存了此信息,因此我使用了 FlexInterval。当应用程序在后台运行或关闭时,工作人员会继续每 12 小时刷新一次服务,并每 6 次刷新一次令牌。它就像一个魅力。

这是一个例子:

构建工作:

 override fun beginWork() {

        val periodicWorkRequest = PeriodicWorkRequest.Builder(
                MyWorker::class.java,
                REPEAT_INTERVAL, TimeUnit.MINUTES, // How often work should repeat
                // Flex not required.
                FLEX_INTERVAL, TimeUnit.MINUTES) // Limits execution into a time window
                .setConstraints(
                     Constraints.Builder().setRequiredNetworkType(
                                       NetworkType.CONNECTED).build())
                .addTag(MY_WORKER_TAG)
                .build()

        WorkManager.getInstance().enqueueUniquePeriodicWork(
                MY_UNIQUE_WORK,
                ExistingPeriodicWorkPolicy.KEEP,
                periodicLoginRequest)

工人:

class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): Result {
            // DO WORK HERE

            Result.success()
        } else {
            // HANDLE FAILURE HERE
            Result.failure()
        }

上面是一个简单的实现,但它应该给你一个大致的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多