WorkManager
使用攻略WorkManager
是 Android JetPack 的一部分。是用于执行后台任务的。
对应的库:implementation "android.arch.work:work-runtime:1.0.1"
WorkerManager
一个简单的 WorkManger
执行,需要包含一个Worker
, 一个WorkRequest
.
比如:
public class MouseWorker extends Worker {
public MouseWorker(@NonNull Context context,
@NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
// 子线程
LogUtils.e(Thread.currentThread().getName());
return Result.success();
}
}
// 执行该 worker
WorkManager.getInstance().enqueue(new OneTimeWorkRequest.Builder(MouseWorker.class).build());
这里的 doWork()
的返回值Result
,除了 Result.success();
还有 失败与重试两种不同的结果。
// Create a Constraints object that defines when the task should run
Constraints constraints = new Constraints.Builder()
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.build();
// ...then create a OneTimeWorkRequest that uses those constraints
OneTimeWorkRequest compressionWork =
new OneTimeWorkRequest.Builder(CompressWorker.class)
.setConstraints(constraints) // 添加约束
.build();
OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
.setInitialDelay(10, TimeUnit.MINUTES) // 延时执行
.build();
这里的 Constraints
提供了好几个 set
方法,比如,是不是充电中这些。
Worker
的执行情况WorkManager.getInstance().getWorkInfoByIdLiveData(uploadWorkRequest.getId())
.observe(lifecycleOwner, new Observer() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
displayMessage("Work finished!")
}
}
});
// lifecycleOwner 是一个接口, AppCompatActivity, Fragment 都实现了这个接口
// 所以,如果是在 activity 里面监听,可以直接传入 this.
WorkManager.getInstance()
// Candidates to run in parallel
.beginWith(Arrays.asList(filter1, filter2, filter3)) // 这里的 1,2,3 会被并行执行
// Dependent work (only runs after all previous work in chain)
.then(compress) // 然后执行该任务
.then(upload) // 然后执行该任务
// Don't forget to enqueue()
.enqueue();
这个有点类型很多 pipline
工具里面配置,可以并行,可以串行。可以先串行 1,2,3然后并行4,5,最后再串行一个 6.
WorkManager.cancelWorkById(workRequest.getId());
// 还有好几个cancleXXX() 的方法,参数不同。
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true)
.build();
PeriodicWorkRequest saveRequest =
new PeriodicWorkRequest.Builder(SaveImageFileWorker.class, 1, TimeUnit.HOURS)
.setConstraints(constraints)
.build();
WorkManager.getInstance()
.enqueue(saveRequest);
OneTimeWorkRequest oneWorkRequest = new OneTimeWorkRequest.Builder(OneWorker.class)
.setInputMerger(ArrayCreatingInputMerger.class).build();
String uniqueWorkName = "unique";
WorkManager.getInstance()
.enqueueUniqueWork(uniqueWorkName, ExistingWorkPolicy.APPEND,
oneWorkRequest);
这里的“特殊”任务,特殊的地方就是需要一个新的参数:ExistingWorkPolicy
,这是一个枚举值。分别代表不同的含义。如果上一个名字相同的特殊任务没有执行完成,那么现在要怎么做? 3个值见名知意,非常容易理解。
特殊任务也是可以串行与并行多个的。调用方式是
WorkManager.getInstance().beginUniqueWork(xxx) ...;
WorkManager.getInstance().enqueueUniqueWork(xx)...
WorkManager
初始化参数
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Configuration configuration = new Configuration.Builder()
.setExecutor(Executors.newFixedThreadPool(8)) // 设置 Workmanager 的后台线程
.build();
WorkManager.initialize(this, configuration);
}
}
–
// 官方文档 的操作,可是我本地死活找不到 Configuration.Provider 这个类
class MyApplication extends Application implements Configuration.Provider {
@Override
public Configuration getWorkManagerConfiguration() {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.build();
}
}
ps: 从文档来看,WorkerManager
与JobScheduler
没有直接的关联。使用上,也不一定要互相关联。
参考链接: