Mp3 Player mit Singleton

Status
Nicht offen für weitere Antworten.

Monkey_D_Ace

Mitglied
Hallo Leute,

ich möchte meinen Mp3 Player (javazoom.jl.player) mit einem Singleton ausstatten damit immer nur einer existiert. Dies hab ich vor weil ich es nicht auf die Reihe krieg nach dem Beenden meiner Spielmusik ein Flag zu setzen, damit nur ein Introsound gespielt. Heißt: irgendwann hab ich 10 mal den gleichen Sound laufen und da jeder in nem eigenem Thread läuft, gibts da irgendwann Schwierigkeiten und die gnaze Sache kachelt ab.

Da mir also das so nicht gelingt mach ich es anders und will die Erzeugung weiter Mp3 Player verhindern indem nur die Erzeugung eines einzigen zulasse.

Jetz hab ich nur das Problem, dass ich ne Variable aus meiner Hauptklasse brauche und der Konstruktor von Singleton Klassen leider private ist. mit welcher Methode bekomme ich die Referenz auf die Klasse die das Objekt erzeugt?

schon mal danke im voraus

Gruß Ace
 
Hi

Das hab ich auf die schnelle mit google gefunden:

Code:
public class Singleton {
 
  // Eine (versteckte) Klassenvariable vom Typ der eigenen Klasse
  private static Singleton instance;
  // Verhindere die Erzeugung des Objektes über andere Methoden
  private Singleton () {}
  // Eine Zugriffsmethode auf Klassenebene, welches dir '''einmal''' ein konkretes 
  // Objekt erzeugt und dieses zurückliefert.
  public static Singleton getInstance () {
    if (Singleton.instance == null) {
      Singleton.instance = new Singleton ();
    }
    return Singleton.instance;
  }
}

Mit getInstance() kann man ein neues Objekt erzeugen, aber nur wenn noch keins existiert.
 
danke für die Antwort Körby. ABER:

hatte die Mp3 Klasse schon soweit umgeschrieben aber das Problem ist dass der beim Aufruf der getInstance komischerweirse immer noch neue Objekte dieser Klasse erstellt. 🙁 das soll er ja nicht

hier mal der Code vlt. fällt ja jemandem ein Fehler auf:

Code:
import javazoom.jl.player.*;
import java.io.*;

public final class Mp3Player {

	private static Mp3Player instance;
	
	 private Player player;
	 private FileInputStream is;
	 
	 static String[] trackList = {"C:\\Dokumente und Einstellungen\\Hanson\\Eigene Dateien\\3.Semester\\Programmieren\\Workspace\\Earth Escape\\bin\\sound\\intro.mp3"
			 , "C:\\Dokumente und Einstellungen\\Hanson\\Eigene Dateien\\3.Semester\\Programmieren\\Workspace\\Earth Escape\\bin\\sound\\StarWars1.mp3"
			 , "C:\\Dokumente und Einstellungen\\Hanson\\Eigene Dateien\\3.Semester\\Programmieren\\Workspace\\Earth Escape\\bin\\sound\\StarWars2.mp3"};
	 
	 PlayerThread pl = new PlayerThread();
	 OutputThread out = new OutputThread();
	 
	 public static Mp3Player getInstance (int a) {
		
		 if (Mp3Player.instance != null){
			 
			 Mp3Player.instance.stopIt() ;
			 
			 Mp3Player.instance = new Mp3Player (trackList[a]);
		 }
		 else {
			 
			if (Mp3Player.instance != null){
				 
				 Mp3Player.instance.stopIt();
			}
			 
			 Mp3Player.instance = new Mp3Player (trackList[a]);
		 }
		 return Mp3Player.instance;
	 }
	 
	 public Mp3Player( String filename ) 
	 {
		 if(true){}
		 try {
			
			 is = new FileInputStream( filename );
			 play();
		 }
		 catch( Exception e ){
			
			 e.printStackTrace();
		 }
	 }
	 
	 private void play()
	 {
		 try {
			 
			 player = new Player( is );
		 }
		 catch( Exception e ) {
			 
			 e.printStackTrace();
		 }
	  
		 pl.start();
		 out.start();
	 }
	 
	 public void stopIt(){
		 
		 try{
			 
			 player.close();
		 }
		 catch(Exception e){
			 
			 e.printStackTrace();
		 }
	 }
	 
	 class PlayerThread extends Thread
	 {
		 public void run() {
			 
			 try {
				 
				 player.play();
			 }
			 catch( Exception e ) {
				 
				 e.printStackTrace();
			 }
		 }
	 }
	 
	 class OutputThread extends Thread
	 {
		 public void run() {
			 
			 while( !player.isComplete() ) {
				 
				 System.out.println( player.getPosition() );
				 
				 try { Thread.sleep(1000); }
				 
				 catch( Exception e ){}
			 }
		 }
	 }
}

Hoffe jemand kann mir helfen
 
Also für mich sieht es fast so aus, als wenn Mp3Player.instance.stopIt() ;
nur den player beendet, aber die Instanz von MP3Player weiterexistiert. Du startest aber direkt dannach einen neuen MP3Player, also gibt es dann mehrere.

Du müsstest demnach in der Methode stopIt() auch die Instanz von MP3Player beenden.
 
klingt einleuchtend; aber wie mach ich das?

mit player = null; hab ichs versucht aber dann kommt nat die NullPointerException

gibt es nen anderen Befehl mit dem ich ein Objekt löschen/wegmachen kann?
 
Erhalte doch einfach die alte Instanz und verzichte darauf eine neue anzulegen.
rufe wenn die Instanz schon vorhanden ist einfach eine neue Methode auf, in der du den FileInputStream is zuweist und die Methode play() aufrufst.
 
jetz hab ich meinen Konstruktor noch auf private gesetzt und noch ne lücke in der Hauptklasse gestopft aber es kommt trotzdem noch vor dass zwei Instanze gleichzeitig existieren.

Ich such mal weiter und meld mich nochmal wenn ich was finde

für weitere Hinweise bin ich nat. dankbar

Gruß Ace
 
else {

if (Mp3Player.instance != null){

Mp3Player.instance.stopIt();
}

Mp3Player.instance = new Mp3Player (trackList[a]);
}
Da ist das Problem, in diesem else zweig legst du einfach immer eine neue Instanz an.
Dazu kommt das dein Singleton nicht hreadsicher ist, wozu überhaupt lazy Initialisierung???
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben