我一直在寻找许多关于如何在特定时间内(例如5分钟)运行特定函数和方法的文章,但我找不到至少与我的案例类似的文章。现在,在我的用例中,我想在1分钟内反复运行一个worker。我计划用这个用例来处理网络连接,所以应用程序将尝试在1分钟内连接到服务器,如果失败了,那么用户可以按下重试按钮。我该怎么做才能得到我想要的?
这是我的doWork:
@NonNull
@Override
public Result doWork() {
Log.e("MyWork", "Starting Worker");
for (long stop = System.nanoTime()+ TimeUnit.SECONDS.toNanos(1); stop>System.nanoTime();) {
Log.e("MyWork", "Running Worker in 1 Minute");
}
// Been using below's code but still didn't work
// long startTime = System.nanoTime();
// while ((System.nanoTime()-startTime)< 5*60){
// Log.e("MyWork", "Running Worker in 1 Minute");
// }
Log.e("MyWork", "Done Running Worker in 1 Minute");
return Result.retry();
}
我想实现的是:
我想在1分钟内重复执行doWork()函数
如果用户在1分钟内没有建立连接,则不能重试
如果应用程序在1分钟内仍然无法连接,则用户可以按重试按钮
这是我希望我能达到的输出:
E/MyWork: Starting Worker
E/MyWork:运行Worker在1分钟与秒- 1
E/MyWork:运行Worker在1分钟与秒- 2
E/MyWork:运行Worker在1分钟与秒- 3
E/MyWork:运行Worker在1分钟与秒- 4
E/MyWork:在1分钟内运行Worker
E/MyWork:运行Worker在1分钟与秒- 60
E/MyWork: Done Running Worker in 1分钟
尝试像这样使用CountDownTimer:
new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
doWork()
}
@Override
public void onFinish() {
Log.d("MyWork", "Done running worker in 1 minute");
}
}.start();