1

アプリケーションが停止しているときに、バックグラウンドでタイマーを効率的に実行するにはどうすればよいですか?rite今私は何もしていません、そしてアプリが停止されたときタイマーは走り続けます、しかし時々それは私がそれに命令を与えることなしに走りを止めます。これは私が現在私のタイマーを実行している方法です:

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

onCreate()で宣言されています、ありがとう!

4

3 に答える 3

3

バックグラウンドで実行されているタスクの場合は、IntentServiceを使用する必要があります。OSによってアクティビティが一時停止または削除されても、実行を継続します。

于 2012-08-07T23:17:17.953 に答える
0

携帯電話のメモリがいっぱいになり始めると、アクティブに使用されていないすべてのアクティビティが閉じられます。

タイマーのようなものの場合、開始時間をSQLiteに保存し、アクティビティがリロードされるときに、それを開始点として参照して期間を計算する方がよい場合があります。

それ以外の場合、タイマーが刻々と過ぎていくという意図がある場合は、タイマーをインテントサービスに変えます。

于 2012-08-07T23:20:18.333 に答える
0

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)
       }
于 2019-11-03T06:12:11.483 に答える