使用Timer / ScheduledThreadPool进行的CPU负载最少,可以经常更改元素

时间:2016-02-02 13:58:22

标签: java android timer scheduledexecutorservice

我想编写一个小的Android应用程序,我想更新我的活动元素 按下按钮后非常快速(每隔约50-250毫秒)。

我还希望能够更新元素更改频率的速度 计时器正在运行。

所以我总是使用" Executors.newSingleThreadScheduledExecutor()"创造一个新的 单线程。 但这是关于CPU / RAM的最佳解决方案吗?

我真的需要经常更改此元素,并且我不希望设备滞后。

当前代码:

// OnCreate
    mtimerTask = new Runnable() {
    @Override
    public void run() {
        // set some variables
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // update some things on the Activity
            }
        });
    }
    };
    mscheduledPool = Executors.newScheduledThreadPool(1);

    // onclickListener
startButton.setOnClickListener(new View.OnClickListener() {
            @Override
        public void onClick(View v) {
        if (mscheduledPool.isShutdown() || firstExecute) { 
        // firstExecute necessary because isShutdown is always false at the beginning
                    firstExecute = false;
        mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS); // sleepTime standard = 200
                } else {
                    mscheduledPool.shutdownNow();
                }
            }
        });


// triggered by buttons
private void updateSpeed(boolean increase) {
    if (increase) {
        someValue += 25;
        sleepTime = Math.round((60 * 1000) / someValue);
        if (!mscheduledPool.isShutdown()) {
            mscheduledPool.shutdownNow();
            mscheduledPool = Executors.newSingleThreadScheduledExecutor();
            mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS);
        }
    }
    else {
        someValue -= 25;
        sleepTime = Math.round((60 * 1000) / someValue);
        if (!mscheduledPool.isShutdown()) {
            mscheduledPool.shutdownNow();
            mscheduledPool = Executors.newSingleThreadScheduledExecutor();
            mscheduledPool.scheduleAtFixedRate(mtimerTask, 0, sleepTime, TimeUnit.MILLISECONDS);
        }
    }
}

也许使用" ScheduleFuture"由" mscheduledPool.scheduleAtFixedRate"返回更多的资源是什么?

期待您的回答:D

1 个答案:

答案 0 :(得分:1)

如果您的想法是仅更新活动的UI而不执行繁重的计算,网络访问,数据库访问等。我建议您使用Handler.postDelayed()方法。它会在主线程上排队运行,在所说的runnable中你可以执行你的UI修改。

这样您就不必创建新线程并自行管理。

对于有关内存使用和性能的每个问题,实现这两个解决方案和配置应用程序实际上都是有意义的。通过这种方式,您可以清楚地了解两种方法所使用的资源。