在android开发中如果执行某个操作没有成功,最多重试执行10次,每次间隔1秒(UI线程需要注意间隔时间不要超过5秒否则会报ARN),如何实现?最近在了解CarService代码发现了一段很好用的代码,分享一下:
import android.util.Log;
import static android.os.SystemClock.elapsedRealtime;
/**
* @author: ql
* @date: 2020/3/19
* @desc: 重试执行
*/
public class TryAgain {
/**
* 执行动作
*/
interface RetriableCallback {
/**
* Returns {@link StatusCode}
*/
int action();
}
/**
* 重试执行
* @param callback 要执行的动作
* @param timeoutMs 超时时长(重试最长时间)
* @param sleepMs 休眠时间(重试间隔)
* @return 状态码 {@link StatusCode}
*/
public static int invokeRetriable(RetriableCallback callback, long timeoutMs, long sleepMs) {
int status = callback.action();
long startTime = elapsedRealtime();
while (StatusCode.TRY_AGAIN == status && (elapsedRealtime() - startTime) < timeoutMs) {
try {
Thread.sleep(sleepMs);
} catch (InterruptedException e) {
Log.e("TryAgain", "Thread interrupted ", e);
break;
}
status = callback.action();
}
return status;
}
/**
* 状态码
*/
public static class StatusCode {
public static int TRY_AGAIN = 0;
public static int OK = 1;
}
}
测试执行5次结束
TryAgain.invokeRetriable(new TryAgain.RetriableCallback() {
@Override
public int action() {
i++;
if (i == 5) {
Log.d("TryAgain", "执行成功");
return TryAgain.StatusCode.OK;
} else {
Log.d("TryAgain", "重试执行" + i);
return TryAgain.StatusCode.TRY_AGAIN;
}
}
}, 10 * 1000, 1000);
结果
2019-12-31 02:10:22.724 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行1
2019-12-31 02:10:23.724 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行2
2019-12-31 02:10:24.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行3
2019-12-31 02:10:25.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行4
2019-12-31 02:10:26.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 执行成功