Androidアプリで簡易なthrottle処理を実装する


明けましておめでとうございます。今年もよろしくお願いします。
ずいぶん久しぶりの記事更新です。今年はもっと投稿できるようにしたいですね。(果たして何本投稿できるかな……)
 
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な変数なので、ライフサイクル的に破棄されることがあると思うので、それでも大丈夫なように、内部の処理に留意ください。

カテゴリー: Android, Java, プログラム

コメントを残す

メールアドレスが公開されることはありません。