Implementation of Polling Timer Based on Rxjava

  • 2021-09-12 02:15:50
  • OfStack

In this paper, we share the specific code of Rxjava polling timer for your reference, the specific contents are as follows

Action

1. After a delay of several milliseconds, the next operation is executed only once

2. After several milliseconds, the next operation can be executed many times

Tool class source code


/**
 * Copyright 2015-2018 Hive Box.
 */

package com.fcbox.locker.shrail.utils;

import android.support.annotation.NonNull;

import com.fcbox.locker.sdk.Locker;
import com.fcbox.locker.sdk.log.LogUtils;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;

/**
 * Rxjava2.x Implement a polling timer .
 *
 * @author xuzhuyun
 */
public class RxTimerUtil {

 private static Disposable mDisposable;

 /**
  * milliseconds Execute in milliseconds next Operation 
  */
 public static void timer(long milliseconds, final IRxNext next) {
  Observable.timer(milliseconds, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<Long>() {
     @Override
     public void onSubscribe(@NonNull Disposable disposable) {
      mDisposable = disposable;
     }

     @Override
     public void onNext(@NonNull Long number) {
      if (next != null) {
       next.doNext(number);
      }
     }

     @Override
     public void onError(@NonNull Throwable e) {
      // Unsubscribe 
      cancel();
     }

     @Override
     public void onComplete() {
      // Unsubscribe 
      cancel();
     }
    });
 }


 /**
  *  Every interval milliseconds Execute in milliseconds next Operation 
  */
 public static void interval(long milliseconds, final IRxNext next) {
  Observable.interval(milliseconds, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<Long>() {
     @Override
     public void onSubscribe(@NonNull Disposable disposable) {
      mDisposable = disposable;
     }

     @Override
     public void onNext(@NonNull Long number) {
      if (next != null) {
       next.doNext(number);
      }
     }

     @Override
     public void onError(@NonNull Throwable e) {

     }

     @Override
     public void onComplete() {

     }
    });
 }


 /**
  *  Unsubscribe 
  */
 public static void cancel() {
  if (mDisposable != null && !mDisposable.isDisposed()) {
   mDisposable.dispose();
   LogUtils.e("====Rx Timer cancellation ======");
  }
 }

 public interface IRxNext {
  void doNext(long number);
 }
}

Call

When calling, the corresponding class needs to implement IRxNext interface, and it can implement its own logic in doNext method. Also remember to call the cancel method to unsubscribe after using it.

Acknowledgement

I can't find the source of the original text, so I would like to thank the original author.


Related articles: