明けましておめでとうございます。今年もよろしくお願いします。
ずいぶん久しぶりの記事更新です。今年はもっと投稿できるようにしたいですね。(果たして何本投稿できるかな……)
Androidアプリで、とあるイベントが走るたびにAPI通信を行っていて動作を圧迫していたようなので、適度に処理を間引く必要が出てきました。
そこで、Javaで簡易なthrottle処理を実装してみました。
Handlerを上手く使えばそれっぽく動くのが完成しました。
[宣言]
/** throttle処理で間引く間隔 */ private static final int THROTTLE_INTERVAL = 60 * 1 * 1000; /** throttle処理用のハンドラ */ private Handler throttleHandler; /** throttle処理を実行した最後の時間 */ private long throttleLastTimeMillis;
[初期化]
@Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 変数を初期化する。 throttleHandler = new Handler(); throttleLastTimeMillis = 0; }
[throttle呼び出し]
//throttle処理を入れて間引く long currentTimeMillis = System.currentTimeMillis(); // 最後に実行した時間から間引きたい時間経過していたら実行 if ((throttleLastTimeMillis + THROTTLE_INTERVAL) <= currentTimeMillis) { throttleLastTimeMillis = currentTimeMillis; //実行したい処理 ・ ・ ・ } else { //重複して呼び出さないようにキャンセルするのを忘れずに throttleHandler.removeCallbacks(throttleTask); //間引いた場合は、間隔明けに実行する throttleHandler.postDelayed(throttleTask, (throttleLastTimeMillis + THROTTLE_INTERVAL) - currentTimeMillis); }
[タスク定義]
/** throttle処理タスク */ private final Runnable throttleTask = new Runnable() { @Override public void run() { throttleHandler.removeCallbacks(throttleTask); throttleLastTimeMillis = System.currentTimeMillis(); //実行したい処理 ・ ・ ・ } };
初回のthrottle呼び出しはそのまま処理されますが、次の呼び出しがTHROTTLE_INTERVALミリ秒分の間隔があいていなければ、HandlerにpostDelayedがセットされます。これは、THROTTLE_INTERVALミリ秒以内であれば何度呼び出されても同じくpostDelayedがセットされるだけです。
一点だけ気を付けるとしたら、throttleLastTimeMillisがprivateな変数なので、ライフサイクル的に破棄されることがあると思うので、それでも大丈夫なように、内部の処理に留意ください。
コメントを残す