[TimerTask] Pause

T

TimerTask

Gast
Hallo,

meine Anwendung implementiert eine Slideshow für Bilder, welche in folgendem TimerTask anläuft.

Java:
public void doDiaShow(final Image[] dias, final int startIndex) {

		timer = new Timer();

		setImages = new TimerTask() {

			@Override
			public void run() {
				slideshow.slide(true);
			}
		};

		slideshow = new SlideShow(dias, startIndex, lk, setImages);

		timer.schedule(setImages, SlideShow.START_UP_TIME,
				slideshow.getTransistionTime());

	}


Die SlideShow wechselt alle "getTransitionTime()" Sekunden das Bild, solange bis der Benutzer einen Abbruch ausführt, dann wird ..

Java:
setImages.cancel();

..aufgerufen.

Ich möchte dem Benutzer die Möglichkeit geben, die SlideShow zu pausieren und bei Bedarf wieder ab der pausierten Stelle abzuspielen.

Meine Versuche mittels wait() und notifiy() auf dem TimerTask blieben ergebnislos.

Wisst ihr, wie man TimerTasks pausieren kann?
 

eRaaaa

Top Contributor
Gibt bestimmt mehrere Möglichkeiten. Eine wäre einfach bei pause() den Timer zu canclen und bei resume() einfach wieder einen neuen zu starten, den State musst du dir dann natürlich irgendwo merken!

Oder du setzt einfach ein boolean den du im run abfragst....
 

turtle

Top Contributor
Zwar habe ich mit TimerTask noch nicht gearbeitet, mir aber den Quelltext davon anschaue, scheint ein Pause/Resume von der API nicht unterstützt zu werden.

Ich schlage vor, dieses in einen eigenen Task/Thread zu tun und sich darin zu merken, ob die Show weiterlaufen oder pausiiert (an welcher Stelle) werden soll.
 
T

TimerTask

Gast
Okay, dann werde ich abbrechen, mir den aktuellen Stand merken und dann fortsetzen.
Merkwürdig, dass es für diesen häufig vorkommenden Fall keine SDK Lösung gibt, findet ihr nicht?
 
T

TimerTask

Gast
Habe es nun so umgesetzt:

Java:
         private void pause() {
		this.canceled = slideshowTask.cancel();
	}

	private void play() {
		if (canceled) {
			close();
			lf.doDiaShow(images, currentIndex);
		}
	}

pause() setzt eine globale boolean Variable. Resume() / Play(), je nachdem, prüft die Variable und instanziiert über doDiaShow() einer Util-Klasse eine neue Diashow mit den Parametern des vorher ablaufenden TimerTask.

Falls jemand das als Antwort braucht.
 

FArt

Top Contributor
Okay, dann werde ich abbrechen, mir den aktuellen Stand merken und dann fortsetzen.
Merkwürdig, dass es für diesen häufig vorkommenden Fall keine SDK Lösung gibt, findet ihr nicht?

Gar nicht merkwürdig:
Thread (Java 2 Platform SE 5.0)
Java Thread Primitive Deprecation

Man könnte nun mit einer Semaphore (Java 2 Platform SE 5.0) arbeiten, oder aber mit notify/wait, aber das eigentliche Problem besteht damit immer noch (denn großartig was anderes macht wohl die Runtime auch nicht).

Somit ist wohl die beste, universelle Lösung den Zustand vom Ausführer zu trennen. Ist sowieso das bessere Design nach dem Single Responsibility Prinicple.
 

Ähnliche Java Themen

Neue Themen


Oben