2016-06-14 6 views
0

Ich möchte Count-Zeit in meinem Dienst starten, wenn ein besonderes Ereignis aufgetreten ist. Und ich möchte das in Worker Thread tun.
sogar Verwendung CountDownTimer() kann dies für mich tun.
Problem ist hier, dass, wenn ich diese Methode in OnHandleIntent() Klasse IntentService verwenden, erhalte ich einen Fehler:
java.lang.IllegalStateException: Handler (android.os.CountDownTimer$1) {235e78c} sending message to a Handler on a dead thread.Zähle mal Dienst mit Worker-Thread in Android

Ist dies der beste Weg Zeit zu zählen und besondere Arbeit zu leisten, wenn die Zeit am Ziel ankommt? wenn nicht wie ich kann? wenn es ist, wie lösen? Vielen Dank.

Mein Service-Code ist:

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

bitte Codes hinzufügen, so dass jeder kann beobachten, was falsch läuft – USKMobility

+0

@USKMobility notwendigen Codes zu hinterfragen hinzugefügt. –

+0

anstelle von 'CountDownTimer', die für andere Zwecke verwendet wird, verwenden' AlarmManager' – pskink

Antwort

1

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

Wenn Absicht Dienst gestartet, einen neuen Arbeitsthread erstellen und wenn ihre Aufgabe beendet wird dann beendete es. Aber in Ihrem Fall verwenden Sie den Countdown-Timer, der nach der Beendigung des Worker-Threads ausgeführt wird, so dass er eine Ausnahme auslöst.

Eine Lösung können Sie versuchen:

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

Schön. Ich möchte nicht viele Threads für einen einfachen Countdown einbinden. ist diese Methode für die CPU optimiert? –

+0

Ja, Looper loops handler thread und countdowntimer in der Warteschlange. Für weitere Details über looper https://blog.nikitaog.me/2014/10/11/android-looper-handler-handlerthread-i/ – USKMobility

+0

Ich habe diesen Fehler: 'verursacht durch: java.lang.RuntimeException: Nur ein Looper kann pro Thread erstellt werden –

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

Nicht funktioniert. Ich habe denselben Fehler. –

+0

Sie verwenden Service oder Intent-Service –

+0

'IntentService' –