`
phenix_chen
  • 浏览: 38210 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

android使用throttle(节流阀)技术

阅读更多

throttle 技术其实并不提升性能,这个技术主要是防止系统被超过自己不能处理的流量给搞垮了,这其实是个保护机制。使用throttle技术一般来说是对于一些自己无法控制的系统,只要是异步,一般都会有throttle机制。

比如:
在android系统中大量是使用ContentObserver(ContentObserver用于监听数据变化),一般情况会在ContentObserver中的onChange方法作相关查询工作,也就说会生成游标。当某时瞬间游标生成过多(数据库查询极端频繁,但属于正常的插入,而且不能用批量插入),会导致内存不够而被系统自动终止该程序。这时我们就可以使用throttle技术。
代码如下:
public class Throttle {
    public static final boolean DEBUG = false; // Don't submit with true

    public static final int DEFAULT_MIN_TIMEOUT = 150;
    public static final int DEFAULT_MAX_TIMEOUT = 2500;
    /* package */ static final int TIMEOUT_EXTEND_INTERVAL = 500;

    private static Timer TIMER = new Timer();

    private final Clock mClock;
    private final Timer mTimer;

    /** Name of the instance.  Only for logging. */
    private final String mName;

    /** Handler for UI thread. */
    private final Handler mHandler;

    /** Callback to be called */
    private final Runnable mCallback;

    /** Minimum (default) timeout, in milliseconds.  */
    private final int mMinTimeout;

    /** Max timeout, in milliseconds.  */
    private final int mMaxTimeout;

    /** Current timeout, in milliseconds. */
    private int mTimeout;

    /** When {@link #onEvent()} was last called. */
    private long mLastEventTime;

    private MyTimerTask mRunningTimerTask;

    /** Constructor with default timeout */
    public Throttle(String name, Runnable callback, Handler handler) {
        this(name, callback, handler, DEFAULT_MIN_TIMEOUT, DEFAULT_MAX_TIMEOUT);
    }

    /** Constructor that takes custom timeout */
    public Throttle(String name, Runnable callback, Handler handler,int minTimeout,
            int maxTimeout) {
        this(name, callback, handler, minTimeout, maxTimeout, Clock.INSTANCE, TIMER);
    }

    /** Constructor for tests */
    /* package */ Throttle(String name, Runnable callback, Handler handler,int minTimeout,
            int maxTimeout, Clock clock, Timer timer) {
        if (maxTimeout < minTimeout) {
            throw new IllegalArgumentException();
        }
        mName = name;
        mCallback = callback;
        mClock = clock;
        mTimer = timer;
        mHandler = handler;
        mMinTimeout = minTimeout;
        mMaxTimeout = maxTimeout;
        mTimeout = mMinTimeout;
    }

    private void debugLog(String message) {
        Log.d(Logging.LOG_TAG, "Throttle: [" + mName + "] " + message);
    }

    private boolean isCallbackScheduled() {
        return mRunningTimerTask != null;
    }

    public void cancelScheduledCallback() {
        if (mRunningTimerTask != null) {
            if (DEBUG) debugLog("Canceling scheduled callback");
            mRunningTimerTask.cancel();
            mRunningTimerTask = null;
        }
    }

    /* package */ void updateTimeout() {
        final long now = mClock.getTime();
        if ((now - mLastEventTime) <= TIMEOUT_EXTEND_INTERVAL) {
            mTimeout *= 2;
            if (mTimeout >= mMaxTimeout) {
                mTimeout = mMaxTimeout;
            }
            if (DEBUG) debugLog("Timeout extended " + mTimeout);
        } else {
            mTimeout = mMinTimeout;
            if (DEBUG) debugLog("Timeout reset to " + mTimeout);
        }

        mLastEventTime = now;
    }

    public void onEvent() {
        if (DEBUG) debugLog("onEvent");

        updateTimeout();

        if (isCallbackScheduled()) {
            if (DEBUG) debugLog("    callback already scheduled");
        } else {
            if (DEBUG) debugLog("    scheduling callback");
            mRunningTimerTask = new MyTimerTask();
            mTimer.schedule(mRunningTimerTask, mTimeout);
        }
    }

    /**
     * Timer task called on timeout,
     */
    private class MyTimerTask extends TimerTask {
        private boolean mCanceled;

        @Override
        public void run() {
            mHandler.post(new HandlerRunnable());
        }

        @Override
        public boolean cancel() {
            mCanceled = true;
            return super.cancel();
        }

        private class HandlerRunnable implements Runnable {
            @Override
            public void run() {
                mRunningTimerTask = null;
                if (!mCanceled) { // This check has to be done on the UI thread.
                    if (DEBUG) debugLog("Kicking callback");
                    mCallback.run();
                }
            }
        }
    }

    /* package */ int getTimeoutForTest() {
        return mTimeout;
    }

    /* package */ long getLastEventTimeForTest() {
        return mLastEventTime;
    }
}
 
0
10
分享到:
评论

相关推荐

    46)_单向节流阀Throttle check valve_RD1.PDF

    46)_单向节流阀Throttle check valve_RD1.PDF

    Laravel开发-throttle 访问节流控制工具

    Laravel开发-throttle 访问节流控制工具 访问流量控制工具

    Throttle v8.3.4.2019.zip

    今天小编要给大家介绍一款专业好用的网络加速软件...采用加速原理是安全有效地更改你的电脑和调制解调器与节流阀,让网速更快而不损坏系统; 下载方便,使用简单; 提供更快的实时网速。 Throttle(网络加速软件)截图

    基于Vue中使用节流Lodash throttle详解

    今天小编就为大家分享一篇基于Vue中使用节流Lodash throttle详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    throttling:Dart的节流阀和去抖动器

    从派生节流Dart库包含“节流”和“反跳”类使用请参阅上的使用演示。节流的例子final Throttling thr = new Throttling (duration : Duration (seconds : 2 ));thr. throttle (() { print ( ' *ping #1' );});await ...

    promise-throttle:节流阀承诺被执行,即一次允许不超过10个

    诺言节气门节流诺言一次要n并发诺言。用法 // run 10 promises at a timevar throttle = require ( 'promise-throttle' ) ( 10 ) ;var request = require ( 'request' ) ;var urls = [ ... ] ;var promises = urls ....

    ThrottleStop 免费版,尽情使用,永不过期!

    ThrottleStop 免费版,尽情使用,永不过期!ThrottleStop 让电脑为性能发烧锁定主频,气绝降频,更可以调节至尊系列处理器的倍频、电压、外频,ThrottleStop 在手,强悍恒持久!

    Laravel开发-queue-throttle

    Laravel开发-queue-throttle Laravel Beanstack队列节流阀

    ThrottleStop-9.5 笔记本处理器intel超频软件

    ThrottleStop_9.5 笔记本处理器intel超频软件

    ThrottleStop

    ThrottleStop确实是一款能最大化使用 SNB平台支持一项名为BD PROCHOT 的技术,它会在CPU和GPU的温度、功耗明显升高时优先降低CPU的频率,以达到控制整机温度及功率保护的目的。 ThrottleStop可以可以关闭BD PROCHOT ...

    ThrottleStop 最新版8.48

    上传资源的目的是因为之前下载的ThrottleStop8.40版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 保证原版资源无任何修改添加。 throttle...

    ThrottleStop使用方法

    ThrottleStop使用方法

    ThrottleStop_500a

    ThrottleStop是一个酷睿2/酷睿i处理器性能调整工具,以监测和正确的CPU节流,许多笔记本电脑上正在使用的3个主要。左侧的ThrottleStop包含多种选项可以用来绕过CPU节流

    防抖和节流Throttle and debounce.html

    防抖和节流

    ThrottleStop 8.20

    上传资源的目的是因为之前下载的ThrottleStop8.10beta2版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 throttlestop是款防cpu降频软件。...

    JavaScript 节流函数 Throttle 详解

    主要为大家详细介绍了JavaScript 节流函数 Throttle,感兴趣的小伙伴们可以参考一下

    ThrottleStop cpu超频调频软件 最新版 v8.6

    throttlestop是电脑cpu性能检测软件。throttlestop主要是为用户实时监测cpu运行性能,并解决笔记玩游戏时温度一高就降频运行迟钝歇菜难题,让玩家能尽情畅玩游戏。 throttlestop功能介绍: 1、用于笔记本调节cpu; 2...

    air_throttle:气流由带步进电机的节气门控制

    该项目可用于控制节流阀,以从外部提供更多新鲜空气。 例如,某些通风系统在运行某些设备时需要大量的新鲜空气。 当设备运行时,节气门被打开,更多的新鲜空气可以轻松地输送到该设备。 当设备关闭时,节气门关闭。 ...

    Throttlestop_CPU鸡血

    免除硬超烦恼,好评如潮的软超软件。Throttlestop_CPU鸡血

    ThrottleStop V8.48解决CPU降频软件.zip

    ThrottleStop8.48是当前最新版本,可以解决8.40版本在使用时提示This beta version has now expired的问题。throttlestop用于防止cpu降频运行,解决电脑cpu达不到最高性能的问题。现在的CPU很智能化,当温度...

Global site tag (gtag.js) - Google Analytics