`
phenix_chen
  • 浏览: 39075 次
  • 性别: 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

    在实际应用中,节流阀和Check 阀经常被组合使用,以实现更好的流量控制和系统安全。例如,在hydraulic系统中,节流阀可以用于控制液体流量,而Check 阀可以用于防止液体回流。 四、节流阀和Check 阀的技术参数 ...

    ThrottleStop使用方法

    ThrottleStop的主要功能是控制CPU的节流行为,它能够禁用Intel的SpeedStep技术,防止CPU在负载较低时自动降低频率以节省电力。通过手动调整设置,你可以使CPU保持在更高的运行速度,提升整体性能。 二、安装与启动 ...

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

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

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

    Throttle中文直译为“节流”,在编程中指的是一种减少资源消耗的技术,具体到Lodash中,throttle函数用于限制函数的执行频率,即在一个时间窗口内,无论调用多少次该函数,它只会执行一次。 #### 在Vue中使用Lodash...

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

    下面将详细介绍ThrottleStop的主要功能和使用方法。 1. **核心功能**: - **频率调整**:ThrottleStop允许用户自定义CPU的核心时钟速度,以提高或降低处理器的运行速度。这对于进行高性能计算或者需要快速响应的...

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

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

    Throttle v8.3.4.2019.zip

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

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

    ThrottleStop是一款强大的工具,其主要功能是禁用Intel的节电技术,例如SpeedStep,这是一种动态调整CPU电压和频率的技术,旨在节省电源并降低温度。在某些情况下,例如需要高性能运行时,SpeedStep可能会限制处理器...

    ThrottleStop_9.2_heat_throttletsop_源码

    2. The ThrottleStop Guide (2019) Ultrabook Review.url:这是一个链接文件,指向2019年关于ThrottleStop的使用指南,可能包含详细的操作步骤和优化建议,适合初次使用的用户参考。 3. logo.png:这应该是Throttle...

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

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

    ThrottleStop_500a

    2. **禁用节流技术**:ThrottleStop可以禁用多种CPU节流技术,如Turbo Boost限制、EIST(增强型Intel SpeedStep)等,消除因节流导致的性能下降。 3. **温度监控**:软件内置了实时的CPU温度监测功能,帮助用户了解...

    ThrottleStop_9.3.zip

    ThrottleStop 9.3版本的压缩包包含了主程序ThrottleStop.exe,以及一些辅助文档和资源,如logo.png(程序图标)、ReadMe.txt(使用说明)、The ThrottleStop Guide - NotebookReview.url(用户指南链接)、The ...

    ThrottleStop_850

    使用ThrottleStop时,用户需谨慎操作,因为不适当的设置可能导致过热、硬件损坏,甚至影响系统的稳定性和寿命。对于那些熟悉硬件和软件的高级用户来说,ThrottleStop是提升电脑性能的强大工具,而对于普通用户,建议...

    ThrottleStop v6.0 汉化(4代CPU 锁频)

    ThrottleStop的工作机制基于CPU的节流技术,这是一项由制造商设计用于节能和防止过热的机制。当CPU负载较轻或温度过高时,它会自动降低时钟速度,也就是所谓的“节流”。然而,对于一些需要高性能的场景,如游戏、...

    throttlestop_8.74.7z

    6. **各种节流技术的禁用**:如SpeedStep、EIST(Enhanced Intel SpeedStep Technology)、C-states(低功耗状态)等,这些技术在默认情况下会降低CPU速度以节省电力。 通过ThrottleStop,用户可以根据自己的需求和...

    ThrottleStop_2993

    ThrottleStop的主要功能集中在调整CPU的各种频率限制上,例如BCLK(基础时钟频率)和倍频,以及Turbo Boost(动态加速技术)设置。通过这些调整,用户可以在游戏、多任务处理或高强度计算时获得更高的性能,而在日常...

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

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

    Throttlestop_CPU鸡血

    在使用ThrottleStop_500这个版本前,建议先了解自己电脑的CPU型号、功耗限制以及散热能力。此外,由于Throttlestop需要管理员权限才能运行,安装和使用时要确保是在安全的环境下进行。 总的来说,Throttlestop是一...

Global site tag (gtag.js) - Google Analytics