2016-06-14 1 views
0

Я хочу начать отсчет времени в моей службе, когда произошло специальное событие. И я хочу сделать это в рабочем потоке.
даже использование CountDownTimer() может сделать это для меня.
Проблема заключается в том, что, когда я использую этот метод в OnHandleIntent() класса IntentService, я получаю сообщение об ошибке:
java.lang.IllegalStateException: Handler (android.os.CountDownTimer$1) {235e78c} sending message to a Handler on a dead thread.Количество раз в службе с рабочей нитью в Android

Это лучший способ подсчитать время и выполнять специальную работу, когда время прибывает в пункт назначения? если не так, как я могу? если да, то как решить? Благодарю.

Мой код обслуживание:

import android.app.IntentService; 
import android.content.Context; 
import android.content.Intent; 
import android.os.CountDownTimer; 
import android.os.Environment; 
import android.util.Log; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

public class TimeService extends IntentService { 



    public TimeService(){ 
     super(""); 

    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     new CountDownTimer(20000,1000){ 

      @Override 
      public void onTick(long millisUntilFinished) { 
       System.out.println("Time remaining: "+millisUntilFinished/1000); 
      } 

      @Override 
      public void onFinish() { 
       System.out.println("done"); 
      } 
     }.start(); 

    } 



} 
+0

добавьте коды, так что любой может наблюдать, что происходит не так – USKMobility

+0

@USKMobility необходимые коды добавлены на вопрос. –

+0

вместо 'CountDownTimer', который используется для других целей, используется' AlarmManager' – pskink

ответ

1

I can not recommend to you to use IntentService. You should use regular service.

Когда цель запуска службы, это создать новый рабочий поток, и когда их задача закончена, то она завершается. Но в вашем случае вы используете Countdowntimer, который запускается после завершения рабочего потока, поэтому он генерирует исключение.

Одно решение, вы можете попробовать:

protected void onHandleIntent(Intent intent) { 
     Looper.prepare(); 
     new CountDownTimer(20000,1000){ 

      @Override 
      public void onTick(long millisUntilFinished) { 
       System.out.println("Time remaining: "+millisUntilFinished/1000); 
      } 

      @Override 
      public void onFinish() { 
       System.out.println("done"); 
       Looper.myLooper().quit(); 
      } 
     }.start(); 
     Looper.loop() ; 
    } 
+0

Ницца. Я не хочу вовлекать много потоков для простого обратного отсчета. этот метод оптимизирован для CPU? –

+0

Да, Looper Loops обрабатывает поток и countdowntimer в очереди. Для получения дополнительной информации о looper https://blog.nikitaog.me/2014/10/11/android-looper-handler-handlerthread-i/ – USKMobility

+0

Я получил эту ошибку: 'Caused by: java.lang.RuntimeException: только один Looper может быть создано за нить' –

1
Trying using your countdown timer in Service class as 

CountDownTimer countDownTimerVariable; 

In @Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 

// based on your condition 
if(condition) 
    { 
    performCountDown(); 
    } 
} 

public void performCountDown() 
{ 
     countDownTimerVariable = new CountDownTimer(remainingMillisForCountDown, 1000) { 
         @Override 
         public void onFinish() { 
          //Action for when the timer has finished. 

          Log.i("timer finish", "finished"); 
      } 

    @Override 
         public void onTick(long millisUntilFinished) { 
          //Action for every tick of the countdown. 
          // timeCalculate((millisUntilFinished/1000)); 
          Log.i("timer finish", "finished" + (millisUntilFinished/1000) + " Countdown"); 

         } 
        }; 
        countDownTimerVariable.start(); 
} 


    and in destroy of service 

     @Override 
    public void onDestroy() { 
    // TODO Auto-generated method stub 
    this.unregisterReceiver(notifyServiceReceiver); 
    super.onDestroy(); 

    if(countDownTimerVariable != null) 
     countDownTimerVariable.cancel(); 
} 
+0

Не работает. У меня такая же ошибка. –

+0

вы используете услугу или услугу –

+0

'IntentService' –

Смежные вопросы