RxJava2.x实现定时器的实例代码

前言

由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整。虽然RxJava1.x和RxJava2.x同属RxJava系列,但由于RxJava2.x部分代码的重写,导致RxJava2.x与RxJava1.x已是两个不同的版本,RxJava2.x在性能上更优,尤其在背压支持上。当然,此篇重点不在Rx版本上的区别,有兴趣的同学可以自行研究。当然,2.x之于1.x的区别之一是2.x中已经没有 Subscription mSubscription, Observable.create()等方法也不再返回 Subscription对像,取而代之的是在 new Observer()方法中会多返回一个
onSubscribe(@NonNull Disposable disposable) 方法,而Disposable disposable即时我们取消订阅要用到的对象,其方法有:

package io.reactivex.disposables;

/**
 * Represents a disposable resource.
 */
public interface Disposable {
  /**
   * Dispose the resource, the operation should be idempotent.
   */
  void dispose();

  /**
   * Returns true if this resource has been disposed.
   * @return true if this resource has been disposed
   */
  boolean isDisposed();
}

dispose():取消订阅

isDisposed():判断订阅是否已经取消

ok,有了这些铺垫之后,我们进入正题。

第一步,导入RxJava2.x依赖包

  //rxjava2.x
  compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
  compile 'io.reactivex.rxjava2:rxjava:2.1.0'

第二步,直接上定时器类RxTimerUtil代码

/**
 * Instruction:Rxjava2.x实现定时器
 * <p>
 * Author:pei
 * Date: 2017/6/29
 * Description:
 */

public class RxTimerUtil {

  private static Disposable mDisposable;

  /** milliseconds毫秒后执行next操作
   *
   * @param milliseconds
   * @param next
   */
  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) {
            //取消订阅
            cancel();
          }

          @Override
          public void onComplete() {
            //取消订阅
            cancel();
          }
        });
  }

  /** 每隔milliseconds毫秒后执行next操作
   *
   * @param milliseconds
   * @param next
   */
  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() {

          }
        });
  }

  /**
   * 取消订阅
   */
  public static void cancel(){
    if(mDisposable!=null&&!mDisposable.isDisposed()){
      mDisposable.dispose();
      LogUtil.e("====定时器取消======");
    }
  }

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

需要注意的是,若你使用的是延时执行一次的话,在调用 timer 后,不需要 cancel,因为我在代码中已经处理好了,
如果是调用的重复执行的方法,你需要在activity的ondestroy方法中取消订阅,类似如下:

@Override
  protected void onDestroy(){
    //取消定时器
    RxTimerUtil.cancel();
    LogUtil.e("====cancel====="+ DateUtil.getNowTime());
    super.onDestroy();
  }

多么简单粗暴,好了,今天就讲到这里吧,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • RxJava2.x实现定时器的实例代码

    前言 由于现在网络层已经升级到RxJava2.x相关的了,所以需要做些调整.虽然RxJava1.x和RxJava2.x同属RxJava系列,但由于RxJava2.x部分代码的重写,导致RxJava2.x与RxJava1.x已是两个不同的版本,RxJava2.x在性能上更优,尤其在背压支持上.当然,此篇重点不在Rx版本上的区别,有兴趣的同学可以自行研究.当然,2.x之于1.x的区别之一是2.x中已经没有 Subscription mSubscription, Observable.create()

  • PyQt5中QTimer定时器的实例代码

    如果要在应用程序中周期性地进行某项操作,比如周期性地检测主机的CPU值,则需要用到QTimer定时器,QTimer类提供了重复的和单次的定时器.要使用定时器,需要先创建一个QTimer实例,将其timeout信号连接到相应的槽,并调用start().然后定时器会以恒定的间隔发出timeout信号,当窗口控件收到timeout信号后,它就会停止这个定时器. 一.QTimer类中的常用方法 方法 描述 start(milliseconds) 启动或重新启动定时器,时间间隔为毫秒.如果定时器已经运行,

  • Java 定时器(Timer)及线程池里使用定时器实例代码

    java Timer定时器 简单实例代码: public class Test { public static void main(String[] args) { // Timer定时器 Timer mTimer = new Timer(); MyTack myTack = new MyTack(); mTimer.schedule(myTack, 2000, 3000);//第一个参数是需要执行的任务 第二个参数是延迟多少时间最开始执行,第三个参数是执行完后多少时间后进行再次执行是一个周期性

  • Python定时器实例代码

    在实际应用中,我们经常需要使用定时器去触发一些事件.Python中通过线程实现定时器timer,其使用非常简单.看示例: import threading def fun_timer(): print('Hello Timer!') timer = threading.Timer(1, fun_timer) timer.start() 输出结果: Hello Timer! Process finished with exit code 0 注意,只输出了一次,程序就结束了,显然不是我们想要的结果

  • C++控制台用定时器实例代码

    本文研究的主要是C++控制台用定时器的相关实例,具体如下. Timer在MFC程序中的使用 在MFC中有一个很好用的定时器函数. 使用SetTimer()进行设置定时器 使用KillTimer()关闭定时器 在OnTimer()函数中,响应WM_TIMER这个消息,也就是定时器的处理函数. 源代码 #define TIMER_UDP_QFX 3//定时器的ID int Period = 1000;//1000ms的定时器 //设置一个定时器 SetTimer(TIMER_UDP_QFX, Per

  • 纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)

    实现效果演示: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>楼层跳跃式的页面布局</title> <meta charset="utf-8"> <style type="text/css"> *{ margin: 0; padding: 0; } body, html{ height: 100%; } ul{ list-style: n

  • JavaScript+CSS相册特效实例代码

    嗯 就是这样一个例子,视频学到的一个特效,实际用处并不大,但是可以帮助理解JS语言和熟悉CSS3样式. 设计: 观察一张图片的变化,发现: 1.图片缩放(随机,并且不是同时运动) 1.从大到小 2.从小到大,透明度从1到0(在第一步运动完成后立马开始) 2.图片旋转(随机,并且不是同时运动的.需要在全部运动走完以后开始) 3. 因为每张图片是随机开始变换的,所以起始时间是不同的,这里可设置一个延迟器setTimeout,时间用random随机生成即可. 4. 中间需要用到自执行函数,因为setT

  • JS实现移动端实时监听输入框变化的实例代码

    如果是在pc端,监听输入框你可能想到focus.blur.hover.onkeyup这些事件,但是如果是在移动端使用使用这些事件用户体验极差,因为你要用户收起键盘并且再点个空白处才生效,甚至还存在很大的兼容差异.那么怎么解决呢? 方案一 以前做一个简单的模糊搜索框的需求,大致思路是定义一个1s左右执行的定时器,定时器函数里面的逻辑是 判断文本框内容的长度,如果跟上一次长度有变化,就走一遍查询,如果没有变化不执行任何操作. 方案二 利用jquery提供的 input propertychange

  • iOS UIScrollView滚动视图/无限循环滚动/自动滚动的实例代码

    我们都知道UIScrollView有一种很流畅的切换效果,结合UIPageControl的辅助展示效果,就可以完成一个很不错的产品介绍功能页面.下面给大家分享iOS UIScrollView滚动视图/无限循环滚动/自动滚动功能,具体代码如下所示: <UIScrollViewDelegate> #define WIDTH [[UIScreen mainScreen] bounds].size.width #define HEIGHT [[UIScreen mainScreen] bounds].

  • 实例代码详解javascript实现窗口抖动及qq窗口抖动

    窗口抖动效果在很多地方都有应用,例如网易的登陆窗口就有这样的效果,当登陆失败的时候就会出现抖动效果,这不但有动感,而且让人感觉新颖,下面是一段这样的代码实例,和大家分享一下. 代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> <meta name="author" content="http://www.softwhy.com/&qu

随机推荐