面试题答案
一键面试- 添加依赖:
在
build.gradle
文件中添加JobScheduler
相关依赖:
implementation 'androidx.work:work-runtime-ktx:2.7.1'
- 创建任务类:
创建一个继承自
Worker
的类,这里假设名为MyTaskWorker
,在doWork
方法中编写要执行的任务逻辑。
import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
class MyTaskWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
override fun doWork(): Result {
// 在此处编写要执行的任务逻辑
return Result.success()
}
}
- 配置任务调度:
在需要配置调度的地方,例如
Activity
或Service
中:
import android.content.Context
import androidx.work.*
import java.util.concurrent.TimeUnit
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 设置任务重复执行时间间隔为24小时
val constraints = Constraints.Builder()
.setRequiresCharging(false)
.build()
val repeatingWorkRequest = PeriodicWorkRequestBuilder<MyTaskWorker>(24, TimeUnit.HOURS)
.setInitialDelay(2, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(applicationContext)
.enqueueUniquePeriodicWork("MyTask", ExistingPeriodicWorkPolicy.KEEP, repeatingWorkRequest)
}
}
关键代码说明:
MyTaskWorker
类中的doWork
方法是实际执行任务的地方。PeriodicWorkRequestBuilder
用于构建周期任务请求,setInitialDelay(2, TimeUnit.HOURS)
设置任务在每天凌晨2点开始执行(假设当前时间是0点,2小时后就是凌晨2点)。WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork
将任务添加到任务队列并设置唯一性策略。
注意:以上代码是基于Android的WorkManager
实现任务调度,虽然题目说是Kotlin后台服务,但Android平台通常使用WorkManager
结合JobScheduler
实现任务调度功能。如果是普通Java后台服务,Java中可以使用ScheduledExecutorService
实现类似功能,如下:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TaskScheduler {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
// 执行任务逻辑
System.out.println("任务执行中...");
}, 2, 24, TimeUnit.HOURS);
}
}
这里scheduleAtFixedRate
方法第一个参数是要执行的任务,第二个参数2
表示延迟2小时执行第一次任务,第三个参数24
表示每24小时执行一次任务。