Android - как периодически запускать задачу через обработчик в сервисном намерении (рабочий поток)

Мой вопрос связан с Android: как мне запускать задачу каждые 20 секунд в службе намерений? Проблема в том, что мне нужно инициализировать некоторые классы, которые будут использоваться в процессе «запуска» обработчика. Это работает один раз, но затем служба останавливается, и приложение падает, когда цикл обработчика снова запускается через 20 секунд (вероятно, из-за классов, которые были удалены при остановке службы?). Так что, может быть, решение состоит в том, чтобы заставить службу работать, пока работает обработчик, или отказаться от кода и сделать это правильно?

Надеюсь, кто-нибудь может мне помочь.

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

Заранее большое спасибо!!!

---- Итак, это обновленный код сейчас (14 ноября 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;
    }
}

}

Все приложение сразу вылетает.


person Ben    schedule 12.11.2011    source источник
comment
Если есть сбой, вам нужно опубликовать logcat.   -  person EboMike    schedule 12.11.2011


Ответы (1)


Как запустить задачу каждые 20 секунд в службе намерений?

Это неподходящее использование IntentService. Используйте обычный Service, пожалуйста.

Это работает один раз, но затем служба останавливается, и приложение вылетает, когда цикл обработчика снова запускается через 20 секунд.

IntentService выключается, когда onHandleIntent() возвращается, поэтому для вас это ломается. Используйте обычный Service, пожалуйста.

Также:

  • Разрешите пользователю настроить период опроса
  • Убедитесь, что эта служба отключается, когда пользователь больше не хочет, чтобы она работала.
person CommonsWare    schedule 12.11.2011