android重试执行
16lz
2021-01-26
在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: 重试执行12019-12-31 02:10:23.724 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行22019-12-31 02:10:24.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行32019-12-31 02:10:25.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 重试执行42019-12-31 02:10:26.725 5791-5791/com.hozon.dmsservicetest D/TryAgain: 执行成功
更多相关文章
- Android(安卓)Espresso
- Android(安卓)Studio报错 程序包android.support.annotation不存
- Android(安卓)APK反编译工具介绍
- Android(安卓)全局异常捕获DefaultUncaughtExceptionHandler与Co
- Button控件
- 正在学习 android 开发,开发环境已搭建完毕,第一个测试程序已在模
- android 新浪微博认证
- android定时器Timer与TimerTask
- android singleTask使用情况,场景分析