Mr. Pivirotto
Mr. Pivirotto

Reputation: 281

How to make a timer run in the background

How would i go about efficiently having a timer run in the background when the application is stopped? rite now i have not done anything and the timer will continue to run when the app has been stopped but some times it will stop running without me giving it the command. This is how i am currently running my timer:

    if(t == null){
   t = new Timer();
    t.schedule(new TimerTask() {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {

                public void run() {
                    if(DHPDPS==0){
                        money = (DPPS+Reserve);
                        Reserve = (money);
                        String end = String.format("%1f", money);
                        t1.setText("$" + end);
                    }else if(counter > DHPDPS && DOTPPS != 0 && DHPDPS != 0){
                        money = (DOTPPS+Reserve);
                        Reserve = (money);
                        String end = String.format("%1f", money);
                        t1.setText("$" + end);
                    } else{

                        money = (DPPS+Reserve);
                        Reserve = (money);
                        String end = String.format("%1f", money);
                        t1.setText("$" + end);
                    }
                    counter++;
                    //if(counter == 3000)
                    //   t.cancel();

                    // Display pay per second
                    if(counter <= DHPDPS || DHPDPS == 0){
                    t2.setText("Your pay per second is: $"+result);
                    }else{
                        t2.setText("Your pay per second is: $"+result2);
                    }
                }
            }); 
        }
    }, 20, 20);

It is declared in the onCreate(), thanks!

Upvotes: 1

Views: 2171

Answers (3)

hardik lathiya
hardik lathiya

Reputation: 1


private fun startTimer() 
       var lastdata = PrefUtils.getpunchtime(this)
       var mEndTimediff = System.currentTimeMillis() - lastdata!!
       var mTimeLeftInMillis = viewModel.START_TIME_IN_MILLIS.toLong() - mEndTimediff

       viewModel.mCountDownTimer = object : CountDownTimer(mTimeLeftInMillis, 1000) {
           override fun onTick(millisUntilFinished: Long) {
               mTimeLeftInMillis = millisUntilFinished
               updateCountDownText(mTimeLeftInMillis)
           }

           override fun onFinish() {
               viewModel.mTimerRunning = false
           }
       }.start()

   }

   private fun updateCountDownText(mTimeLeftInMillis: Long) {

       val millis: Long = mTimeLeftInMillis
       val hms = String.format(
           "%02d : %02d: %02d", TimeUnit.MILLISECONDS.toHours(millis),
           TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(
               TimeUnit.MILLISECONDS.toHours(
                   millis
               )
           ),
           TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(
               TimeUnit.MILLISECONDS.toMinutes(
                   millis
               )
           )
       )

       binding.tvTimertime.setText(hms)
   }

SharePreference in store Last_time


       fun storepunchtime(context: Context, storepunchtime: Long) {
           val editor = getSharedPreferences(context).edit()
           editor.putLong(PUNCH_TIME, storepunchtime)
           editor.apply()
           editor.commit()
       }
       fun getpunchtime(context: Context): Long? {
           return getSharedPreferences(context).getLong(PUNCH_TIME, 0L)
       }

Upvotes: 0

Quinma
Quinma

Reputation: 1476

If your phones memory starts filling up it will close all the activities that are not actively being used.

For something like a timer it might be better to save the start time into SQLite and when the activity is reloaded reference it as a start point to calculate the duration.

Otherwise, if your intent that the timer keeps ticking turn it into an intent service.

Upvotes: 0

kgautron
kgautron

Reputation: 8263

For tasks running in the background you should be using an IntentService. It will keep running even if your activity is paused or removed by the OS.

Upvotes: 3

Related Questions