Retry机制

Retry机制1 前言在日常开发中 有时在执行某些操作时 可能当时条件不满足 未能执行 但是后续的一定时间内 条件会满足 这时我们需要继续执行操作 为了达到这种效果 我们就需要使用到 retry 机制 在后续的规定时间里 有间隔的去尝试执行操作 2 具体流程 privateHandl Handler newHandler Looper getMainLoope Overri

1.前言

在日常开发中,有时在执行某些操作时,可能当时条件不满足,未能执行,但是后续的一定时间内,条件会满足,这时我们需要继续执行操作。为了达到这种效果,我们就需要使用到retry机制,在后续的规定时间里,有间隔的去尝试执行操作。

2.具体流程

方法一:

private Handler m_Handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_CLOSE_MESSAGE: closeMessage(msg.obj.toString()); break; case MSG_OPEN_MESSAGE_SCOUTER_OFF: if (m_isMessageAllowedtoOpen) { openRetryMessage(m_RetryRunable); } break; default: break; } }; }; //retry 6次,每次间隔5min private OpenRetryMessageRunnable m_RetryRunable = new OpenRetryMessageRunnable("message", 5 * 60 * 1000, 6); private void openRetryMessage(OpenRetryMessageRunnable runnable) { if(null != m_Handler){ m_Handler.removeCallbacks(runnable); runnable.resetTask(); m_Handler.post(runnable); } } private class OpenRetryMessageRunnable implements Runnable { 
    private String m_MessageID; private int interval = 0; private int times = 0; private int defInterval=0; private int degTimes=0; public OpenRetryMessageRunnable(String messageID, int interval, int times) { m_MessageID = messageID; this.interval = interval; this.times = times; this.defInterval=interval; this.degTimes=times; } public void resetTask(){ this.interval=defInterval; this.times = degTimes; } @Override public void run() { try { Log.d(TAG, "OpenRetryMessageRunnable:m_MessageID=" + m_MessageID); boolean openResult = false; IRemoteSysService m_Service = myApp.getInstance().getRemoteSysService(); if (null == m_Service) { Log.d(TAG, "OpenRetryMessage failed m_Service==null"); } else if (!m_Service.isMessageOpened(m_MessageID)) { if ("message".equals(m_MessageID)) { CONNECTION_STATUS connectStatus = MyController.getInstance().getCurrentConnectionStatus(); Log.d(TAG, "getCurrentConnectionStatus:connectStatus=" + connectStatus); if (CONNECTION_STATUS.DISCONNECTED == connectStatus) { openResult = m_Service.openMessage(m_MessageID); if (openResult) { m_isMessageAllowedtoOpen = false; } } else { openResult = true;// end runnable } } else { openResult = m_Service.openMessage(m_MessageID); } } else { Log.d(TAG, "OpenRetryMessage failed m_MessageID=" + m_MessageID); } if (!openResult) { if (times > 0) { m_Handler.postDelayed(this, interval); times--; } } }catch (RemoteException e) { Log.d(TAG, "OpenRetryMessageRunnable exception,m_MessageID=" + m_MessageID); } } }

方法二:

 private int count = 0; private Timer m_timer = null; private TimerTask m_task = null; //retry 3次,每次间隔8s private void startTimer(){ m_timer = new Timer(); m_task = new TimerTask() { @Override public void run() { if(isUpdating()){ ++count; if(count == 3){ Log.d(TAG, "startTimer >>> count=3!" ); //do something removeTimer(); } }else{ if(OPEN_MESSAGE_SUCCESS == openMessage("message")){ Log.d(TAG, "startTimer >>> message has opened!" ); } removeTimer(); } } }; if (m_task != null && m_timer != null) { m_timer.schedule(m_task, 8000, 8000); } } private void removeTimer(){ if (m_task != null) { m_task.cancel(); m_task = null; } if (m_timer != null) { m_timer.cancel(); m_timer = null; } if(count != 0){ count = 0; } } //使用此retry时,只需调用startTimer()即可
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207649.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:24
下一篇 2026年3月19日 下午1:24


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号