使用Android的工作管理器按顺序运行工作请求的动态列表

0s7z1bwu  于 2022-12-09  发布在  Android
关注(0)|答案(3)|浏览(110)

我正在尝试学习如何将android的WorkManager与Kotlin一起使用,但我很难弄清楚如何从一个没有设置大小的OneTimeWorkRequests列表中按顺序运行一组请求。
首先,我有一个OneTimeWorkRequests列表,我使用

val requestList: MutableList<OneTimeWorkRequest> = ArrayList()

创建每个条目并将其添加到此列表中,其内容沿着如下:

val dataBuilder = Data.Builder()
val data = dataBuilder.putString("key", "data").build()
val request = OneTimeWorkRequest.Builder(MyWorker::class.java).setInputData(data).setInitialDelay(10, TimeUnit.SECONDS).build()
requestList.add(request)
// Each entry has different data and an initial delay

我知道,通常,如果我们想使用WorkManager按顺序运行工作,我们会执行类似以下的操作:

val workManager = WorkManager.getInstance(context)
workManager.beginWith(request1).then(request2).then(request3).then(request4).enqueue()

但我的问题是列表中的请求数没有设置,所以我需要的“then”调用数是未知的。我想创建这个列表,然后运行一个循环,用workManager创建序列,但这似乎是不可能的,因为“beginWith”和“then”调用似乎需要同时调用。MyWorker类所做的唯一一件事就是打印出包含数据的日志,因此这一部分一点也不复杂。
那么,是否有一种方法可以使用WorkManager来完成这一任务呢?或者,我是否应该尝试使用其他方法来实现一系列事件的发生呢?如果有任何帮助,我们将不胜感激。谢谢!

cclgggtu

cclgggtu1#

查看文档:https://developer.android.com/topic/libraries/architecture/workmanager/advanced#chained
开个玩笑,但我能通过查看文档来了解这一点。重要的部分隐藏在评论中

WorkManager.getInstance(myContext)
    .beginWith(workA)
        // Note: WorkManager.beginWith() returns a
        // WorkContinuation object; the following calls are
        // to WorkContinuation methods
    .then(workB)    // FYI, then() returns a new WorkContinuation instance
    .then(workC)
    .enqueue()

但这只是你想要的答案的一部分,你会想做这样的事情。

val workTaskList: List<WorkRequest> // Some list of tasks
var workContinuation = WorkManager.getInstance(myContext)
    .beginWith(workTaskList[0]) // Ensure 0 is indexable... 
     for(i 1..workTaskList.size) {
       //Make sure you update workContinuation or all the thens won't get enqueued
        workContinuation = workContinuation.then(workTaskList[i])
     }
workContinuation.enqueue()
sqyvllje

sqyvllje2#

我也有同样的问题,也许你可以让你的列表任务是静态的,并开始下一个任务时,成功的最后一个。

9gm1akwq

9gm1akwq3#

这是我用Java实现的代码,任何需要它的人都可以使用
1.将您的WorkRequests添加到List(我使用的是ArrayList
1.然后构建第一个WorkRequest,它将返回WorkContinuation对象
1.使用该对象对更多的WorkRequest进行排队,每个WorkRequest将返回一个新的WorkContinuation对象。每次排队将返回一个新的WorkContinuation对象,并将下一个对象添加到该对象中
1.终于enqueue()他们。

//Add WorkRequest to ArrayList for chaining them
 ArrayList<OneTimeWorkRequest> workRequests = new ArrayList<>();
 int userCount = prefs.getInt("login_accounts", 0);

 //Build and Add all WorkRequests to the ArrayList
 for (int i = 0; i < userCount; i++) {
     Data inputData = new Data.Builder()
                 .putInt("user_id", i)
                 .build();
     OneTimeWorkRequest completeDailySearchesForUser =
                 new OneTimeWorkRequest.Builder(DailySearches.class)
                         .setConstraints(constraints)
                         .setInputData(inputData)
                         .build();
     workRequests.add(completeDailySearchesForUser);
 }

 // check if you have more than 1 WorkRequest in ArrayList
 if (workRequests.size() > 1) {
     // Add the first one and remove it from ArrayList
     WorkContinuation workContinuation = WorkManager.getInstance(context.getApplicationContext())
                 .beginWith(workRequests.remove(0));

     // Loop over the remaining requests and chain them
     for (OneTimeWorkRequest userWorkRequest : workRequests ) {
             workContinuation = workContinuation.then(userWorkRequest);
     }
     // Finally call enqueue to kick things off
     workContinuation.enqueue();
 } else {
     // If there is only 1 request in list, add a normal request
     // This will ignore calling WorkManager if the list is empty (workRequests.size() = 0)
     if (workRequests.size() == 1) WorkManager.getInstance(context.getApplicationContext())
                 .enqueue(workRequests.get(0));
 }

相关问题