【问题标题】:Combine two services?合并两个服务?
【发布时间】:2015-11-04 06:01:36
【问题描述】:

我在后台有一个带有计时器的服务。此计时器在 20 秒后执行某个任务。我希望 same 计时器执行 another 任务,但秒数不同。通过同时启动这两种服务很容易,但我正在尝试学习如何以另一种方式做到这一点。

我试过了,但没有显示出来:

 cdt = new CountDownTimer(20000, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {

                Log.v(TAG, /*"Time remaining " +*/ (millisUntilFinished / 1000) + " seconds left");


                if(millisUntilFinished / 10000 == 0){ //TEN SECONDS
                    Log.v(TAG, (millisUntilFinished % 1000) + " seconds left");
                }

            }

            @Override
            public void onFinish() {
                Log.v(TAG, "Finished");

现在,我应该在十秒内收到两条不同的日志消息。相反,我只得到一个。这是我的 logCat:

箭头指示应该有另一个日志消息的位置。

我迷路了。我真的很感激任何反馈(正面或负面)!非常感谢您的所有帮助。

【问题讨论】:

    标签: java android multithreading android-activity service


    【解决方案1】:

    正如您自己所说,您可以同时启动这两种服务。

    或者在第一个服务中,您可以传递带有一些参数的Intent 来告知新的时间量,然后调用startService()

    Intent it = new Intent(getApplicationContext(), YourService.class);
    it.putExtra("Time", timeInMillis);
    startService(it);
    

    我的意思是,修改您的 Service 以从调用 Intent 中获得额外的收益,如下所示:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
        if (intent != null) {
            long time = intent.getLongExtra("Time",0);
            // Do your ticking here, based on that variable.
        }
        //...
    }
    

    编辑:假设您想让计时器首先在 5 秒时运行,然后在 10 秒、15 秒时运行,以此类推。

    完成计时器后,您可以将Intent 传递给新的Service/Timer,并添加您想要的秒数。喜欢:

    it.putExtra("Time", timeInMillis + 5000);
    

    【讨论】:

    • 我什么时候添加额外的,因为我只想要 10 秒后。另外,附带说明:我计划在更多间隔后收到这些消息。例如,在 5 和 10 和 15 上;为每个人提供新服务会很痛苦。我还有其他方法可以做到这一点吗?如果没有,那没关系,只需告诉我将您提供的代码的意图放在哪里。非常感谢!
    • 我认为有很多方法可以实现这种行为......我的编辑就是其中一种。如果你真的在使用Service 类。
    • 谢谢,我标记了你的最佳答案并喜欢你的帖子!
    【解决方案2】:

    使用这种类型。

     cdt = new CountDownTimer(10000, 1000) { //finished on 10 Seconds
    
                @Override
                public void onTick(long millisUntilFinished) {
                    Log.v(TAG, /*"Time remaining " +*/ (millisUntilFinished / 1000) + " seconds left"); 
                }
    
                @Override
                public void onFinish() {
                    Log.v(TAG, "First 10 Seconds Finished"); 
    
               LoadNextCountdown(); // call the Next Countdown method  
    
      }
            }
                    .start();
    
    //Method for Next Countdown
    
    public void LoadNextCountdown()
    {
        cdt2=new CountDownTimer(10000,1000) { //finished on 10 Seconds
    
                    @Override
                    public void onTick ( long millisUntilFinished){
    
                        Log.v(TAG, /*"Time remaining " +*/ (millisUntilFinished / 1000) + " seconds left");
                    }
    
                    @Override
                    public void onFinish () {
                        Log.v(TAG, "Next 10 Seconds Finished");
                    }
                } .start();
    
    }
    

    快乐编码:)

    【讨论】:

    • 感谢您的回复!这样做的问题是 10 秒是在最初的 20 秒之后计算的。我的目标是计算 20 秒,但在计算 10 秒后(在同一个计时器中)然后显示日志。我该怎么做?谢谢
    【解决方案3】:

    您的日志没有显示,因为:

                if(millisUntilFinished / 10000 == 0){ //TEN SECONDS
                    Log.v(TAG, (millisUntilFinished % 1000) + " seconds left");
                }
    

    您希望它在您有 10000 毫秒UntilFinished 但 10000/10000 = 1 而不是 0 时显示。

    应该是:

         if(millisUntilFinished / 10000 == 1) || if(millisUntilFinished % 10000 == 0)
    

    或者简单地说:

        if(millisUntilFinished == 10000)
    

    【讨论】:

    • 感谢您的回答!我已经完成了最后一个方法,if(millisUntilFinished == 10000)。问题是,倒数计时器不准确,因此不一定会达到 10000 标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2019-12-15
    相关资源
    最近更新 更多