标签: android-workmanager

如何在 MIN_PERIODIC_INTERVAL_MILLIS 之前测试 PeriodicWorkRequest?

为了测试重复性工作,我需要等待整整15分钟(参考)来测试重复性,这确实效率不高。有没有更好更快的方法让开发人员更快地进行测试?

android android-workmanager

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

如何解决工作经理的多实例问题?

我有一个工人要做定期任务。并且在创建活动中调用此工作者。每次活动打开时都会创建一个新实例,并在同一时间多次执行相同的任务。我这样称呼任务

task = new PeriodicWorkRequest.Builder(BackgroundTask.class, 1000000, TimeUnit.MILLISECONDS).build();
WorkManager.getInstance().enqueue(task);
Run Code Online (Sandbox Code Playgroud)

如何避免创建多个实例?如果没有工作人员在运行,我需要在创建活动时调用实例。

android android-service android-studio-3.0 android-workmanager

6
推荐指数
2
解决办法
2919
查看次数

立即调用 workmanager 侦听器

我需要在 WorkManager (android.arch.work:work-runtime-ktx:1.0.0-alpha11) 完成工作时进行回调。然而,我正在添加的侦听器在安排工作后立即被调用。

这是我所做的:

val work = OneTimeWorkRequestBuilder<UploadWorker>()
                .setConstraints(constraints)
                .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
                .setInputData(inputData)
                .build()
workManager.beginUniqueWork(INSURANCE_UPLOAD_WORKER, ExistingWorkPolicy.REPLACE, work)
                .enqueue().result.toWorkResult()
Run Code Online (Sandbox Code Playgroud)

UploadWorker 类只有在完成整个上传序列后才返回 Success。

这是扩展功能代码:

private val executor = Executor { command -> command?.run() }

class WorkResult(private val future: ListenableFuture<*>) {

    fun addListener(listener: () -> Unit) {
        future.addListener(Runnable {
            debugLog("work result listener runnable called")
            listener()
        }, executor)
    }

}

internal fun ListenableFuture<*>.toWorkResult(): WorkResult {
    return WorkResult(this)
}
Run Code Online (Sandbox Code Playgroud)

当我将侦听器添加到 WorkResult 时,它们都会立即被调用,而无需等待实际工作完成。对此有什么想法吗?

android android-workmanager

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

定期工作请求未在工作管理器中执行 doWork

我正在尝试使用PeriodicWorkRequestin定期从远程 url 获取数据WorkManager。我已经实现了逻辑,这里的问题是我没有从Worker.

然而它似乎doWork()在第一次启动时调用,但它没有从网络调用中获取数据。我很惊讶,当我使用时,OneTimeWorkRequest我得到了成功的结果doWork()和来自服务器的数据。

我可能做错了什么?

代码如下:

工人阶级

public class WorkerClass extends Worker {

private Context context;
public static final String EXTRA_WORKER_CLASS = "extra_tag";

public SpecialOffer(@NonNull Context context, @NonNull WorkerParameters workerParams) {
    super(context, workerParams);
    this.context = context;
}

@NonNull
@Override
public Result doWork() {
    Log.d("WORKER_PERIOD", "started");
    String url = "https://sampleurl/get.php";
    //Volley synchronous call
    RequestFuture<String> future = RequestFuture.newFuture();
    StringRequest request = new StringRequest(url, future, future);
    MySingleton.getInstance(context).addToRequestQueue(request);

    try {
        String response …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-jetpack android-workmanager

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

使用 WorkManager 更新 Room 中的数据库条目

我正在尝试WorkManager在 Android 中使用,因为到目前为止我已经使用AsyncTask. 我正在尝试更新Room database. 我创建了一个类Repository来在后台执行该过程,但我不知道这是否是正确的编码方式。我也有点困惑如何在 userViewModel 中调用该方法。

这是我的代码:

在存储库中:

inner class Test(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {

    override fun doWork(): Result {
        fun updateUser(userId : Int , userName :String , userLastname: String){
            userDao.updateUser(userId, userName, userLastname)
        }
        return Result.success()
    }
}
Run Code Online (Sandbox Code Playgroud)

在视图模型中:

private val workManager: WorkManager = WorkManager.getInstance()
fun updateUser(userID: Int, userName: String, userLastname: String)    {
    workManager.enqueue(OneTimeWorkRequest.from(Repository.Test::class.java))

}
Run Code Online (Sandbox Code Playgroud)

也许这不是使用 WorkManager 的正确方法,所以如果有人能帮助我,我将不胜感激。

android kotlin android-room android-jetpack android-workmanager

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

2048 kb 的 WorkManager 光标窗口分配失败

我使用了 WorkManager 版本android.arch.work:work-runtime:1.0.0-beta03。我使用这个 workmanager 使用 OneTimeWorker 以动态间隔时间将文件上传到服务器。

这就是我所做的。希望你能检查一下并告诉我我错在哪里以及解决它的替代方法。

首先,我提出工作要求

    OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
            .setInitialDelay(0), TimeUnit.SECONDS)
            .addTag("UploadData")
            .build();

    WorkManager
            .getInstance()
            .getWorkInfoByIdLiveData(workRequest.getId())
            .observeForever(workInfoObserverBackground);
    WorkManager
            .getInstance()
            .enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
Run Code Online (Sandbox Code Playgroud)

然后,定义观察者以听取其结果。我也从这里开始下一次运行。

workInfoObserverBackground = workInfo -> {
            if (workInfo != null){
                switch (workInfo.getState()) {
                    case SUCCEEDED:
                    case FAILURE:
                        WorkManager.getInstance().getWorkInfoByIdLiveData(workRequest.getId()).removeObserver(workInfoObserverBackground);
                        WorkManager.getInstance().cancelUniqueWork("UploadData");
                        WorkManager.getInstance().cancelAllWorkByTag("UploadData");
                        workRequest = new OneTimeWorkRequest.Builder(MyWorkRequest.class)
                                .setInitialDelay(next_interval_time_received_from_api), TimeUnit.SECONDS)
                                .addTag("UploadData")
                                .build();
                        WorkManager
                                .getInstance()
                                .getWorkInfoByIdLiveData(workRequest.getId())
                                .observeForever(workInfoObserverBackground);
                        WorkManager
                                .getInstance()
                                .enqueueUniqueWork("UploadData", ExistingWorkPolicy.REPLACE, workRequest);
                        break;
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

几分钟后(我无法记录它,因为它是随机发生的)它崩溃了,这是从 logcat 收集的堆栈跟踪。

1-15 21:46:14.806 25964-26054/com.example.app E/AndroidRuntime: FATAL EXCEPTION: pool-8-thread-1 …
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

6
推荐指数
0
解决办法
279
查看次数

WorkManager google api:为每个定期工作人员执行等待 15 分钟?

有没有办法从 WorkManager Google API测试PERIODIC工作人员,而无需为每次执行至少等待 15 分钟?

我的意思是,它是一个调试应用程序,我正在通过 Android Studio 运行它,我不想等待这么长时间来测试我的功能。

android android-workmanager

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

WorkManager 是否需要 BOOT_COMPLETED?

RECEIVE_BOOT_COMPLETED重新启动后,WorkManager是否需要重新安排工作人员的权限?如果不是 WorkManager 如何处理这个?

firebase-job-dispatcher android-job android-workmanager

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

带有 enqueueUniquePeriodicWork 的 PeriodicWork 不起作用

我试图通过创建一个每 5 天重复一次的定期 Worker 来使用 WorkManger。

我在华为 Android 7 设备 (API 24) 上使用 1.0.0 版 workmanagers

android.arch.work:work-runtime:1.0.0
Run Code Online (Sandbox Code Playgroud)

这是代码:

fun schedule() {
    val constraints: Constraints = Constraints.Builder().apply {
        setRequiredNetworkType(NetworkType.CONNECTED)
    }.build()

    val request = PeriodicWorkRequest
            .Builder(MyWorker::class.java, 5, TimeUnit.DAYS)
            .setConstraints(constraints)
            .build()

    WorkManager.getInstance()
            .enqueueUniquePeriodicWork(MyWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, request)
}
Run Code Online (Sandbox Code Playgroud)

我的工人:

class MyWorker(appContext: Context, workerParams: WorkerParameters)
    : Worker(appContext, workerParams) {

    override fun doWork(): Result {
        return try {
            Thread.sleep(5000)
            Timber.i("success")
            Result.success()
        } catch (e: Exception) {
            Timber.e(e, "error")
            Result.failure()
        }
    }
Run Code Online (Sandbox Code Playgroud)

该方法在 MainActivity 中schedule()调用onCreate() …

android android-jetpack android-workmanager

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

如何在没有序列化的情况下将对象作为输入传递给 WorkManager?

我需要将复杂对象传递给 WorkManager。或者我需要序列化包含 Livedata 和 Date 的对象。

它抛出 java.lang.IllegalArgumentException: KeycabinId2 has invalid type class com.example.sonyadmin.data.Task

     val data = workDataOf("cabinId2" to task)
     val uploadWorkRequest = OneTimeWorkRequestBuilder<WManager>()
         .setInputData(data)
         .build()
Run Code Online (Sandbox Code Playgroud)

android-workmanager

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