java - 如何使用 ScheduledExecutorService 更改重复任务的速率或周期?

标签 java android runnable recurring scheduledexecutorservice

<分区>

我有一个修改版的蓝牙聊天示例应用程序。我已经设置了一个 ScheduledExecutorService,它使用 scheduleAtFixedRate 以预定义的速率通过蓝牙发送命令。

我已经设置了一个 PreferenceActivity 以允许用户修改时间段。但我不确定如何让实际的重复任务在更新期间发生。我是否需要以某种方式取消并重新启动 ScheduledExecutorService

这是我的代码的相关部分。

private ScheduledExecutorService scheduleTaskExecutor;

public long ReadInterval = 1;

...    

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
...
    // This schedule a task to run every 1 second:
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
      public void run() {


        // If you need update UI, simply do this:
         runOnUiThread(new Runnable() {
            public void run() {
            // update your UI component here.
              if (connected == true) {
                  sendMessage("READ");                
                  if (D) Log.i(TAG, "In Run!");                   
              }
            }
        });
      }
    }, 0, ReadInterval, TimeUnit.SECONDS);      
    }

我试图在这里更新 ReadIntervalReadInterval 正在更新,但循环命令周期未更新。

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (D)
        Log.d(TAG, "onActivityResult " + resultCode);
    switch (requestCode) {
    case REQUEST_CONNECT_DEVICE:
...
    case REQUEST_ENABLE_BT:
...
    case REQUEST_SETTINGS:
        // When returning from settings activity
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        String Pref = sharedPref.getString(SettingsActivity.KEY_PREF_READINTERVAL, "");
        ReadInterval = Long.valueOf(Pref);
        Toast.makeText(this, Pref,
                    Toast.LENGTH_SHORT).show();

        Log.d(TAG, "Settings Activity Result");
    }
}

最佳答案

我稍微改进了答案(主要是因为我也必须使用 ScheduledExecutorService)。请使用此代码而不是我发布的上一个代码,因为上一个代码确实是关于性能的,没有充分的理由。

private ScheduledExecutorService scheduledExecutorService;
private ScheduledFuture<?> futureTask;
private Runnable myTask;

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    // Your executor, you should instanciate it once for all
    scheduledExecutorService = Executors.newScheduledThreadPool(5);

    // Since your task won't change during runtime, you can instanciate it too once for all
    myTask = new Runnable()
    {
        @Override
        public void run()
        {
            // Your code to run periodically
        }
    };
}

/**
 * This method will reschedule "myTask" with the new param time
 */
public void changeReadInterval(long time)
{
    if(time > 0)
    {       
        if (futureTask != null)
        {
            futureTask.cancel(true);
        }

        futureTask = scheduledExecutorService.scheduleAtFixedRate(myTask, 0, time, TimeUnit.SECONDS);
    }
}

现在,要在运行时重新安排任务,请使用方法 changeReadInterval(time);

如果已经设置,它将取消之前的“定时器”,并重新安排一个新的。

关于java - 如何使用 ScheduledExecutorService 更改重复任务的速率或周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620806/

相关文章:

Java并发场景——需要同步还是不需要?

java - 从 runnable 访问方法的正确方法

android - 延迟效果很好;稍作修改,没有延迟——为什么?

java - 如何防止 imageview 中的图像被裁剪成正方形?

java - Java 枚举的性能

android - 显示高度为 'matchparent' 的图像并保持纵横比

Android 在触摸 ListView 时删除软键盘

android - System.out.println() 的等效方法而不是 Log

java - Java 中的 "implements Runnable"与 "extends Thread"

java - 如何制作可点击的小部件[Android]