Android - Service: timer wiederholt nicht

  • Antworten:7
honiahaka10
  • Forum-Beiträge: 4

24.05.2014, 15:33:39 via Website

Moin! Ich habe ein Problem, ein Android-Service zu erstellen, in dem eine Aufgabe wiederholt ausgeführt wird. Es soll alle 3 Sekunden die aktuelle Zeit ausgegeben werden.

Allerdings wird die Zeit nur einmal ausgeführt und danach nicht mehr, wo liegt der Fehler?

public class TimerService extends Service {
static final int UPDATE_INTERVAL=3000;
private Timer timer = new Timer();
private Date date;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    repeatJob();
    //Here we want this service to continue running until it is explicitly stopped, so return sticky
    return START_STICKY;
}

private void repeatJob() {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Looper.prepare();

            date = new Date();
            displayToast(date.toString());
            Log.d("repeat", new Date().toString());

            Looper.loop();
        }
    }, 0, UPDATE_INTERVAL);
}

private void displayToast(String text) {
    Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

}

Aufgerufen wird der Service in der Fragment-Activity:

getActivity().startService(new Intent(getActivity().getApplicationContext(), TimerService.class));

Außerdem wüsste ich gern, wie genau ich das Datum wieder in der Fragment-Activity benutzen kann.

Vielen Dank! :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.05.2014, 17:02:28 via Website

Wenn du dir dein Code richig anschaust, dann weisst du wieso.

In deiner Repeatjob Methode startest du einen Timer der nach 3 Sekunden das Toast anzeigt.
Von einem Neustart des Timers ist nie die Rede.
Du benötigst noch eine Schleife drumrum oder ein Aufruf auf sich selbst.
-> Das hat dann aber zur Folge dass sich dein Service nicht mehr beenden lässt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
honiahaka10
  • Forum-Beiträge: 4

24.05.2014, 17:55:15 via Website

Ich denke die Funktion Timer.scheduleAtFixedRate ist dafür da, etwas alle x Millisekunden auszuführen?
Wie würde das denn aussehen mit der Schleife?

    private void repeatJob() {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Looper.prepare();

            date = new Date();
            displayToast(date.toString());
            Log.d("repeat", new Date().toString());

            Looper.loop();
        }
    }, 0, UPDATE_INTERVAL);
    repeatJob();
}

Das resultiert in einem StackOverflowError.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.05.2014, 13:54:17 via Website

ist klar, die Funktion muss innerhalb des Timers aufgerufen werden.
Sonst kommt Android mit der verarbeitung nicht hinterher.

  private void repeatJob() {
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        Looper.prepare();

        date = new Date();
        displayToast(date.toString());
        Log.d("repeat", new Date().toString());
     repeatJob();
        Looper.loop();
    }
}, 0, UPDATE_INTERVAL);

}

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
honiahaka10
  • Forum-Beiträge: 4

25.05.2014, 14:47:18 via Website

Vielen Dank, funktioniert jetzt :)
Kannst du mir zufällig auch erklären, wie ich das hinkriege, date an fragment-activity zu übertragen, dass ich das Datum in einer TextView anzeigen kann statt in einem Toast?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.05.2014, 16:37:02 via Website

Dann musst du diesen Timer in deriner Fragmentklasse ausführen, und das Datum innerhalb des Timers in eine TextView setzen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
honiahaka10
  • Forum-Beiträge: 4

27.05.2014, 22:50:40 via Website

War vom Prof leider gefordet, alles in einem Service auszuführen.
Ich konnte ihn leider nicht dazu befragen, weil er nur ein Gast-Professor war, aber jetzt brauch ich das erstmal eh nicht mehr, weil schon alles abgebenen wurde.
Danke für deine Hilfe :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.05.2014, 13:36:34 via Website

Kein Problem.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten