【问题标题】:How to stop old timer如何停止旧计时器
【发布时间】:2014-08-24 08:25:55
【问题描述】:

我使用计时器来安排一些事情在时间之后做。当我关闭我的应用程序时,计时器会一直存在,直到工作完成。 (这是我想要的,我做到了)。但是当我再次打开它时,会运行 2 个计时器(旧的和新的)。 重新打开应用程序时如何删除旧计时器。我知道我的问题很难理解。但我希望有人能帮助我。谢谢

【问题讨论】:

    标签: android timer scheduled-tasks


    【解决方案1】:

    当您的活动调用 onStop 时,您应该停止计时器。

    查看一个Activityhttp://developer.android.com/reference/android/app/Activity.html的生命周期

    如果你的定时器是一个全局变量

    @override
    public void onStop(){
        super.onStop();
        mTimer.cancel();
    }
    

    好吧,如果您想在用户关闭表单后保存数据,那么使用服务是个好主意。 在您的活动 onStop() 您可以将所有表单数据保存在可打包/可序列化的模型中, 将该模型放入意图服务中,然后使用 startService(Intent) 调用服务

    @Override
    public void onStop(){
        FormData formData = recoverAllMyFormData();
        Intent myServiceIntent = new Intent(this, MyService.class);
        myServiceIntent.putParcelable("INTENT_EXTRA_FORM_DATA", formData);
        startService(myServiceIntent);
        super.onStop();
    }
    

    然后,在您的 Service 中将调用 onStartCommand。我喜欢使用 ThreadPoolExecutor 一次控制一个线程

    //Global variable
    private ThreadPoolExecutor storerExecutor = new ThreadPoolExecutor(1, 18, 50, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10));
    
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        final FormData formData = intent.getParcelable("INTENT_EXTRA_FORM_DATA");
        if(formData != null){
            storerExecutor.execute(new Runnable(){
                 public void run(){
                      //Use your sqlite code to store the form
                 }
            });
        }
        return Service.START_NOT_STICKY;
    }
    

    注意:FormData 应该实现 Parcelable

    这就是我可以在没有看到你的代码的情况下提出的建议;)

    【讨论】:

    • 我知道。但我必须完成一些事情。所以我必须等待取消它。当它没有被取消时,用户可以重新打开它。并运行 2 个计时器。当 2 个计时器做同样的事情时,可能会发生一些冲突。
    • 也许您可以使用服务并同步您想要执行的过程。在 android 中使用 Timer 和 TimerTask 是一种不好的做法。还有其他非常好的方法来安排任务。关注处理程序、服务和 TimerTasks。
    • 谢谢。我使用了 Timmer 做的服务。 5 秒后,我想执行一个 Asysntask 以将数据从 sqlite 更新到电子表格。在 asysntask 中更新时,用户可以将数据添加到 sqlite。关闭应用程序时,所有数据形式的 sqlite 都需要更新。所以我等待util更新完成,我取消计时器。你能给我一些建议吗?
    【解决方案2】:

    您应该在退出应用程序时致电Timer.cancel()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2012-03-23
      • 2017-05-18
      • 2014-07-22
      相关资源
      最近更新 更多