我正在开发一个Android应用程序,每次用户打开Wi-Fi或移动数据时,我都使用Firebase JobDispatcher库运行后台作业,但不幸的是,该库已被弃用,现在使用新的WorkerManager去。
我的问题是,每次仅可用互联网时,如何使用WorkerManager来运行作业?
我已经查看了WorkerManager库迁移指南和文档,但是使用OneTimeWorkRequest或PeriodicWorkRequest无法实现。
这是我与Firebase JobDispatcher库一起使用的代码。
xmlns:app="http://schemas.android.com/apk/res-auto"
答案 0 :(得分:0)
WorkManager的官方文档包括migration guide,用于将应用程序从Firebase JobDispatcher转换为WorkManager。
关键点在于,WorkManager允许以类似于Firebase JobDispatcher的方式将Constraints
设置为您的WorkRequest
:
Constraints constraints = new Constraints.Builder()
// The Worker needs Network connectivity
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest request =
// Executes MyWorker every 15 minutes
new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
// Sets the input data for the ListenableWorker
.setConstraints(constraints)
.build();
这会在有连接时每15分钟(最小间隔)执行一次工作。您要考虑的另一个限制是,一个Worker不能运行超过10分钟。在此间隔之后,操作系统将停止您的工作程序。
两个限制都来自Android框架中的底层JobScheduler API。
答案 1 :(得分:-1)
您可以将Constraints
设置为WorkRequest
,以便仅在网络连接可用时运行。在此处查看示例:WorkManager Basics
答案 2 :(得分:-2)
最好一次启动工作管理器并设置“网络类型”作为检查条件, 在Workmanager的doWork()中可用的连接,而不是调用工作管理器 一遍又一遍。
setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
尝试此解决方案
导入工作经理
https://developer.android.com/jetpack/androidx/releases/work
然后发起Worker
类
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(WorkManagerDemo.class, 15, TimeUnit.MINUTES)
.addTag("WorkManagerDemo").setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("WorkManagerDemo", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
其中WorkManagerDemo
类是
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class WorkManagerDemo extends Worker {
public WorkManagerDemo(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
//do your work here
return Result.success();
}
}