Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法停止/更新处理程序(removeCallbacksAndMessages)_Java_Android_Service_Timer_Handler - Fatal编程技术网

Java 无法停止/更新处理程序(removeCallbacksAndMessages)

Java 无法停止/更新处理程序(removeCallbacksAndMessages),java,android,service,timer,handler,Java,Android,Service,Timer,Handler,我已经实现了一个以自定义间隔周期性更新UI的服务。 更改更新间隔时,我希望停止当前处理程序,并使用新的间隔重新开始。 正如我之前在其他线程中读到的,在触发处理程序之后,不可能中断处理程序。 但是,上面提到的解决方案,如删除回调和消息 handler.removeCallbacksAndMessages(null); handler.removeCallbacks(runnable); 例如实现一个kill开关 started = false; if(

我已经实现了一个以自定义间隔周期性更新UI的服务。 更改更新间隔时,我希望停止当前处理程序,并使用新的间隔重新开始。 正如我之前在其他线程中读到的,在触发处理程序之后,不可能中断处理程序。 但是,上面提到的解决方案,如删除回调和消息

        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
例如实现一个kill开关

   started = false;
   if(started) {
      //do work..
   }
根本没有帮助。当我以更新的间隔重新启动服务时,处理程序不会停止,导致多个处理程序同时运行

有人知道我做错了什么或如何改进吗? 谢谢你的帮助!谢谢

//Mainactivity
  startService(new Intent(this, updateService.class));


public class updateService extends IntentService {

    private boolean started = false;
    private Handler handler = new Handler();


    public updateService() {
        super("updateService");
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
            // Try to stop handler when startservice is called and start new one afterwards 
            stop();
            start();
        return super.onStartCommand(intent, flags, startId);
    }

    public void start() {
        started = true; // Didn't help

        int timer = config_store.getPreference("refresh_interval"));
        if (timer !=0){
            handler.postDelayed(runnable, timer);
        }
        else {
            stop();
        }

    }

 public void stop() {

        started = false;
        handler.removeCallbacksAndMessages(null); // Didn't help
        handler.removeCallbacks(runnable);  // Didn't help
    }

 private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if(started) {  // Didn't help.
                // Update job
                doJob();

                // Start over again
                start();
            }
        }
    };

}
好的,我自己修好了: 延迟处理程序不是循环调用methodos的最佳解决方案。 现在使用TimerTask:

  public int onStartCommand(@Nullable Intent intent, int flags, int startId) {

        if(mTimer != null) {
            mTimer.cancel();
        }
        mTimer = new Timer();

        int timer = Integer.parseInt(getPreference("refresh_interval")) * 1000;
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), timer, timer);
        return super.onStartCommand(intent, flags, startId);
    }

    class TimeDisplayTimerTask extends TimerTask {

        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                   // Do job
                }
            });
        }   
}

我想你只是在这段代码中开始了这个线程。这个线程是如何停止的?