Android - hoe een taak via "handler" periodiek uitvoeren binnen een service-intentie (worker-thread)

My question is Android related: How do I run a task every 20 seconds within an intentservice ? Problem is, I have to init some classes which will be used in the Handler "run" process. It works one time - but then the service stops & the application crashes when the handler-loop starts again after 20 seconds (probably because of the classes that got eliminated when the service stopped?). So maybe the solution is to get the service to stay running as long as the Handler runs or to throw away the code and do it right ?

Hoop, iemand kan me helpen.

public class Fadenzieher extends IntentService{

 private Handler handler = new Handler();

 private Runnable timedTask = new Runnable(){

      @Override
      public void run() {

   //My functions get called here... 
           //class1member.getDBWorkdone(); 

       handler.postDelayed(timedTask, 20000); 
       handler.obtainMessage();

      }};

public Fadenzieher() {
    super("Fadenzieher");

}

@Override
  protected void onHandleIntent(Intent intent) {

   //SOME INITIALISING
   //I have to init some vars & functions here that 
           //will also be used inside the handler loop
           //Class1 class1member = new Class1();
   //class1member.startUpDB();

          handler.post(timedTask); }

Alvast heel erg bedankt!!!

---- Dit is dus de bijgewerkte code (14. nov. 2011)

public class Fadenzieher extends Service{
  private static final long UPDATE_INTERVAL = 60000;
Context context = this;
private Timer timer = new Timer();
DbHelper dbHelper;

public void onCreate(){
dbHelper = new DbHelper(context);
runTheLoop();
}

 protected void runTheLoop() {

    timer.scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run() {

        dbHelper.dosomethings();
        Toast.makeText(context, "CALL", Toast.LENGTH_LONG).show();
        }}, 0, UPDATE_INTERVAL);

  }

@Override   
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Starte Service“, Toast.LENGTH_SHORT).show();

   return super.onStartCommand(intent,flags,startId);
}

public void onDestroy() {
    super.onDestroy();
    dbHelper.close();
    Toast.makeText(this, "Stoppe Service“, Toast.LENGTH_LONG).show();

}

// We return the binder class upon a call of bindService
@Override
public IBinder onBind(Intent arg0) {
    return mBinder;
}

public class MyBinder extends Binder {
    Fadenzieher getService() {
        return Fadenzieher.this;
    }
}

}

De hele applicatie crasht onmiddellijk.

0
Als er een crash optreedt, moet je de logcat plaatsen.
toegevoegd de auteur EboMike, de bron

1 antwoord

Hoe voer ik om de 20 seconden een taak uit binnen een intentservice?

Dat is niet het juiste gebruik van IntentService . Gebruik alstublieft een reguliere Service .

It works one time - but then the service stops & the application crashes when the handler-loop starts again after 20 seconds

IntentService shuts down when onHandleIntent() returns, which is why this is breaking for you. Use a regular Service, please.

Ook:

  • Sta de gebruiker toe de polling-periode te configureren
  • Zorg ervoor dat deze service wordt afgesloten als de gebruiker niet langer wil dat deze wordt uitgevoerd
4
toegevoegd