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

问题描述 投票:0回答:1

我已经实现了一项服务,该服务以自定义间隔周期性地更新UI。更改更新间隔时,我要停止当前处理程序并以新间隔重新开始。正如我之前在其他线程中读到的那样,在触发处理程序之后,无法中断处理程序。但是提到的解决方案,例如删除回调和消息

        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);

例如实施kill switch

   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();
            }
        }
    };

}
java android service timer handler
1个回答
0
投票

确定,请自行修复:延迟处理程序不是循环调用方法的最佳解决方案。现在使用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
                }
            });
        }   
}
© www.soinside.com 2019 - 2024. All rights reserved.