#需求 :需要定时的调用接口,来检测后台数据的变化。
看到文章说workmanager是今年谷歌推荐了,然后我也是新手,没试过AlarmManager和JobScheduler,就想着试试workmanager。
##在做之前我当然是先百度一波
一些基本概念和一些变量的意思,我在这里就不说了,大家百度一搜,很多文章都有讲解。
先上代码:
首先是需要做的事情放在哪里?
public class HTTPwork extends Worker {
@NonNull
@Override
public Result doWork() {
//TODO 需要在任务中执行的业务逻辑
Log.e("SimpleWorker", "doWork哈哈哈哈");
return Result.SUCCESS;
}
}
复制代码
然后:
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 网络状态
.setRequiresBatteryNotLow(true) // 不在电量不足时执行
.setRequiresCharging(true) // 在充电时执行
.setRequiresStorageNotLow(true) // 不在存储容量不足时执行
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
constraints.setRequiresDeviceIdle(true) // 在待机状态下执行,需要 API 23
}else{ }
val workRequest = PeriodicWorkRequest.Builder(HTTPwork().javaClass,MIN_PERIODIC_INTERVAL_MILLIS,TimeUnit.MILLISECONDS)
.setConstraints(constraints.build())//
.build();
WorkManager.getInstance().enqueue(workRequest);//这串代码是加入任务队列的意思
复制代码
注意在setConstraints时,后面的constraints要加build()。我看到很多的文章都没有加,导致类型不一样会报错。
MIN_PERIODIC_INTERVAL_MILLIS和TimeUnit.MILLISECONDS是间隔15分钟执行一次,我测试过,不是很准确。
如果这个HTTPwork是用Kotlin写的:
class Httpwork:work(){//这里的work()已经过时
Override fun dowork():Result{
reutrn Result.SUCCESS
}
}
---------------过时后应该用这个--------------
class aaa(context: Context,wp:WorkerParameters):Worker(context,wp){
override fun doWork(): Result {
return Result.SUCCESS
}
}
复制代码
但是这样用之后,定时反而更不准确了,第一次运行时重复一次性运行5到6次,我也没找到原因。