Android 如何实现RxJava中throttleFirst方法

概述

在指定时间内只执行一次,类似RxJava中的throttleFirst方法,最近在做Android网络监控,发现断网和连上网时,会有回调多次,这样就会导致我们的逻辑被调用多次,不合符需求,本来打算用RxJava中throttleFirst方法做,后来想想还是自己实现,毕竟也不难;

具体实现:

package com.manbot.rebot.utils;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.annotation.WorkerThread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BotSingleCallUtil {
private static boolean isTimeIn;//是否还在指定时间内
private static long mTime;//指定的时间,默认2秒
private static Lock mLock = new ReentrantLock();
private static BotSingleCallUtil mThrottleFirst;
private static HandlerThread handlerThread;
private static Handler handler;

private static BotSingleCallUtil initSingleCall() {
    if (null == mThrottleFirst) {
        try {
            mLock.lock();
            if (null == mThrottleFirst) {
                mThrottleFirst = new BotSingleCallUtil();
                isTimeIn = true;
                mTime = 2000;
                handlerThread = new HandlerThread("Manbot WorkThread");
                handlerThread.start();//必须得启动线程,要抛NullException
                handler = new MyHandler(handlerThread.getLooper());
            }
        } finally {
            mLock.unlock();
        }
    }
    return mThrottleFirst;
}

static class MyHandler extends Handler {
    public MyHandler(Looper looper) {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 0) {
            isTimeIn = true;
        } else if (msg.what == 1) {
            Observer observer = (Observer) msg.obj;
            observer.callback();
        }
    }
}

private BotSingleCallUtil setTimeIn(long time) {
    this.mTime = time;
    return this;
}

/**
 * 子线程中调用
 *
 * @param observer
 */
@WorkerThread
public void subcribe(Observer observer) {
    try {
        mLock.lock();
        if (isTimeIn) {
            isTimeIn = false;
            Message message = handler.obtainMessage();
            message.obj = observer;
            message.what = 1;
            handler.sendMessage(message);
            handler.sendEmptyMessageDelayed(0, mTime);
        }
    } finally {
        mLock.unlock();
    }

}
//构建者
public static class Builder {
    public Builder() {
        initSingleCall();
    }

    public Builder setTimeIn(long time) {
        if (isTimeIn && mThrottleFirst != null) {
            mThrottleFirst.setTimeIn(time);
        }
        return this;
    }

    public BotSingleCallUtil build() {
        return mThrottleFirst;
    }
}

public interface Observer {
    void callback();
}

public void release() {
    if (handler != null) {
        handler.removeCallbacksAndMessages(null);
    }
    mThrottleFirst = null;
}
}

说明:这里我假装用了构建者模式和单例模式,不是很清楚构建者模式的实现,见笑了各位;

  • 构建者模式:
    构建者模式就是构建复杂对象,并不让使用者知道对象内部如何实现,对外隐藏了具体的实现,例如:Retrofit;
  • 单例模式:
    全局至存在一个对象;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,436评论 25 708
  • 前言 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboar...
    AWeiLoveAndroid阅读 2,893评论 4 42
  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 9,203评论 6 151
  • 原文地址:http://gank.io/post/560e15be2dca930e00da1083 前言 我从去年...
    AFinalStone阅读 2,224评论 5 23
  • 第二天早上我们直奔圣地延安。宜川到延安只有150公里左右,无论是省道还是高速,路况都出奇的好,路面漆黑,黄白交通...
    杨新华_edf7阅读 496评论 1 0