在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: 執行成功