Android - как периодически запускать задачу через «обработчик» внутри сервисного намерения - PullRequest
0 голосов
/ 12 ноября 2011

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

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

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

}

Сбой сразу всего приложения.

1 Ответ

4 голосов
/ 12 ноября 2011

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

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

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

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

Также:

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