java - 使用 Timer/ScheduledThreadPool 来减少频繁更改元素的 CPU 负载

标签 java android timer scheduledexecutorservice

我想要编写一个小型 Android 应用程序,并且想要更新我的 Activity 中的一个元素 非常快速且频繁地按下按钮后(每约 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);
        }
    }
}

也许使用“mscheduledPool.scheduleAtFixedRate”返回的“ScheduleFuture”可以节省更多资源?

期待您的答复:D

最佳答案

如果您的想法是仅更新 Activity 的 UI,而不执行繁重的计算、网络访问、数据库访问等,我建议您使用 Handler.postDelayed() 方法。它将在主线程上排队一个可运行对象,并且在所述可运行对象中您可以执行 UI 修改。

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

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

关于java - 使用 Timer/ScheduledThreadPool 来减少频繁更改元素的 CPU 负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155456/

相关文章:

java - JCR (JackRabbit) 查询返回空结果

Java Swing的drawString显示回声

php - 如何从输入流中获取字符串值?

timer - 如何在 SWI-Prolog 中定期调用 statistics/2?

ios - 快速激活停止后,秒表上的开始按钮会重置计时器

java - 如何让Android Studio生成R.java?

java - 尽管数组可能尚未初始化,但如何使我的代码编译无错误?

android - 抽屉导航,概念问题

java - 在 Android 布局 XML 中将 TextView 放置在 EditText 元素之前会导致 EditText 不显示

c - 基于S3C2440的linux设备驱动的定时器计数误差