isPlaying() Methode der MediaPlayer Klase

  • Antworten:6
  • Bentwortet
Georg C.
  • Forum-Beiträge: 235

06.04.2014, 19:13:43 via Website

Hallo,
damals habe ich das Problem hier "berührt"

Und eigentlich habe das Problem wieder. Die isPlaying() Methode der MediaPlayer Klase wirkt eigentlich nicht wirklich ... oder mit dem Programmrumpf (Laufzeit) stimmt was nicht.

Programm:
Drei Buttons starten jemals 1 von 5 Songs im Zufallsmodus.
Alles Funktioniert wie gewollt (wird noch erweitert ... kompakter gemacht ...) außer!:
dass ich mehrere Songs auf einmal mit einem Button abspielen kann. Und genau das möchte ich NICHT!

Ich versuche das Problem in dem Code zu Erläutern.
Das (Core) Hauptproblem befindet sich in der playSound_Lov(hit) Methode.

1package ...;
2import ...;
3
4
5public class Kurak extends Activity {
6
7 // Eifach drei Buttons
8 ImageButton imgButton_Lov;
9 ImageButton imgButton_Precar;
10 ImageButton imgButton_Badmo;
11
12
13 Random random = new Random();
14 int hit = random.nextInt(4)+1;
15
16 // Drei MediaPlayer objekte
17 public MediaPlayer mp_lov, mp_prec, mp_badmo;
18
19 // Jede MP-Obj. bekommt seine Sounds
20 private int[] songs_bad = {R.raw.bad1, R.raw.bad2, R.raw.bad3, R.raw.bad4, R.raw.bad5};
21 private int[] songs_pre = {R.raw.prec1, R.raw.prec2, R.raw.prec3, R.raw.prec4, R.raw.prec5};
22 private int[] songs_lov = {R.raw.lov1, R.raw.lov2, R.raw.lov3, R.raw.lov4, R.raw.lov5};
23
24
25
26 @Override
27 protected void onCreate(Bundle savedInstanceState) {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.activity_kurak);
30
31 imgButton_Lov = (ImageButton) findViewById(R.id.imageButton1);
32 imgButton_Precar = (ImageButton) findViewById(R.id.imageButton2);
33 imgButton_Badmo = (ImageButton) findViewById(R.id.imageButton3);
34
35 imgButton_Lov.setOnClickListener(Lov_Listener); // Register the onClick listener with the implementation above
36 imgButton_Precar.setOnClickListener(Precar_Listener);
37 imgButton_Badmo.setOnClickListener(Badmo_Listener);
38
39
40 }
41
42
43 @Override
44 public boolean onCreateOptionsMenu(Menu menu) {
45 // Inflate the menu; this adds items to the action bar if it is present.
46 getMenuInflater().inflate(R.menu.kurak, menu);
47 return true;
48 }
49
50 //OnClickListener des Lov-Button
51 private OnClickListener Lov_Listener = new OnClickListener() {
52 public void onClick(View v) {
53 //Log.d("Lov_Listener ","onClick() Lov-button");
54
55 /*
56 ##### Somit -> alle Mediaplayer Objekte initialisieren und ausführen
57 ##### wirkt auch die isPlaying() Methode
58
59 mp_lov1 = MediaPlayer.create(this, R.raw.lov1);
60 mp_lov2 = MediaPlayer.create(this, R.raw.lov2);
61 mp_lov3 = MediaPlayer.create(this, R.raw.lov3);
62 ...
63 mp_badmo15 = MediaPlayer.create ....15);
64
65 ##### möchte das aber verhindern
66 */
67
68 // einfach die playSound_Lov(hit) Methode mit einem int hit als parameter ausführen
69 playSound_Lov(hit);
70 // bei eventuellem nächstem Klick neu Mischen (neue Zufalszahl generieren)
71 hit = random.nextInt(4)+1;
72 }
73 };
74
75 //OnClickListener des Precar-Button
76 private OnClickListener Precar_Listener = new OnClickListener() {
77 public void onClick(View v) {
78 //Log.d("Precar_Listener ","onClick() Precar-button");
79
80 playSound_Pre(hit);
81 hit = random.nextInt(4)+1;
82 }
83 };
84
85 //OnClickListener des Badmo-Button
86 private OnClickListener Badmo_Listener = new OnClickListener() {
87 public void onClick(View v) {
88 //Log.d("Badmo_Listener ","onClick() Badmo-button");
89
90 playSound_Bad(hit);
91 hit = random.nextInt(4)+1;
92 }
93 };
94
95 protected void playSound_Lov(int index) {
96
97 /*
98 Ein versuch das Problem mit einem Thrad zu lösen.
99
100 new Thread(new Runnable() {
101 int index = 1; // for test only!
102 public void run() {
103 mp_lov = MediaPlayer.create(getApplicationContext(), songs_lov[index]);
104 if(!mp_lov.isPlaying()){
105 mp_lov.start();
106 }
107 }
108 }).start();
109 */
110
111 // MediaPlayer- Objekt mit dem ... Song ... initialisieren und erzeugen / starten.
112 mp_lov = MediaPlayer.create(getApplicationContext(), songs_lov[index]);
113
114 // bei eventuellem nächstem Klick nicht nochmal starten,
115 // bevor das Song nicht zu ende abgespielt wird.
116 if(!mp_lov.isPlaying()){
117 mp_lov.start();
118 }
119 }
120
121 protected void playSound_Pre(int index) {
122
123 mp_prec = MediaPlayer.create(getApplicationContext(), songs_pre[index]);
124 if(!mp_prec.isPlaying()){
125 mp_prec.start();
126 }
127 }
128
129 ...
130 ...

Soll es bedeuten, dass ich alle 15 Mediaplayer Objekte in der Create Methode initialisieren / ausführen soll?
Das wäre ABER! Speicherbelastung PUR!
Oder ist das so "Normal"?
ODER?
Habe ich einen Denkfehler gemacht?
Für einen Denkanstoß wäre ich soeben dankbar!


LG
Georg

— geändert am 06.04.2014, 19:23:00

Sorry für Gramatik & Stilistik Fehler.

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

06.04.2014, 20:17:42 via Website

Wieso machst du das ganze nicht komplett dynamisch?

Du braust dafür nur ein MediaPlayer objekt.
Wenn jetzt der Button für bad gedrückt wird dann inizialiererst du den mp für den bad soun, in der onClickfür prec überschreibst du dieses einfach für den prec Sound.
Ist der Ansatz klar oder habe ich dein Problem falsch verstanden. Du willst doch zuerst mal von den 15 Objekten oder?
PS: wieso lagerst du den Abspiel code in einen Thread aus?

— geändert am 06.04.2014, 20:21:38

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

Antworten
Georg C.
  • Forum-Beiträge: 235

06.04.2014, 21:12:05 via Website

Also meine App soll:
- 3 Verschiedene Buttons (für alla Kategorie) haben
(Button1, 2, 3)
- ein klick auf den Button1 soll einen von 5 Songs aus der Kategorie1 zufällig abspielen
(Sounds aus der Kategorie1 [Pool] sound1,2,3,4,5)
- ein klick auf den Button2 soll einen von 5 Songs aus der Kategorie2 zufällig abspielen
(Sounds aus der Kategorie2 [Pool] sound1,2,3,4,5)
- ein klick auf den Button3 soll einen von 5 Songs aus der Kategorie3 zufällig abspielen
(Sounds aus der Kategorie3 [Pool] sound1,2,3,4,5)
...
Deshalb meine Unterteilung auf 3 MediaPlayer Objekte.
Klar - später möchte ich es kompakter (Dynamischer) machen, in dem ich einfach mit Methoden und Parametern arbeite, ....
Mein Problem zurzeit ist:
ich mache mir (wahrscheinlich um sonst) Gedanken um die Speichernutzung.
(Alle 15 Mediaplayer Objekte mit allen Songs initialisieren und starten.)
Wenn ich es nicht (in der Create Methode der Activity) mache, dann funktioniert die isPlaying() Methode im Laufzeit nicht, was wieder dazu führt, dass mehrere Klicks auf die Buttons, die Songs parallel starten.

FAZIT:
Wenn ich alle 15 Mediaplayer Objekte in der Create Methode der Activity starte funktioniert auch die isPlaying() Methode, und alles ist OK!
Aber - egal wie ich es "Dynamisch" mache, funktioniert die isPlaying() Methode nicht!

1mp_lov = MediaPlayer.create(getApplicationContext(), songs_lov[index]);
2 if(!mp_lov.isPlaying()) // <---- dass hier wird nicht ausgewertet
3 {
4 mp_lov.start();
5 }
Mit einer Folge, dass weiteres klicken auf das Button einfach neuen (oder denselben) Song parallel startet.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

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

08.04.2014, 01:18:18 via App

Was wird denn zurückgegeben wenn du in den Debugmodus gehst?
Warscheinlich false da du im Code dein Madiaplayer nirgends startest. d.h. deine if wir nie ausgeführt.

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

Antworten
Georg C.
  • Forum-Beiträge: 235

08.04.2014, 18:58:41 via Website

Hallo,
also ich (außer, dass ich den Hals voll habe, und werde die App auf SoundPool umschreiben) vermute, dass die Madiaplayer ´ne Macke (Bug) hat. Aber ob es auch stimmt, habe keine Zeit, Lust, wie auch bin mir nicht sicher ob ich es in der Lage bin es rauszufinden.
Falls Dich das interessiert, hier das Debug:
1) ######################################################
Methode:
1protected void playSound_Lov(int index) {
2
3 System.out.println("################## My log line startup ####################");
4
5 mp_lov = MediaPlayer.create(getApplicationContext(), songs_lov[index]);
6
7 if(mp_lov != null && !mp_lov.isPlaying()){
8 try {
9 mp_lov.prepare();
10 mp_lov.start();
11 } catch (IllegalStateException e) {
12 e.printStackTrace(); System.out.println(e.toString());
13 } catch (IOException e) { e.printStackTrace(); System.out.println(e.toString());}
14 }
15 System.out.println("################## My log line end ####################");
16 }

Debug:
04-08 16:08:58.914: I/System.out(545): ################## My log line startup ####################
04-08 16:08:59.094: E/MediaPlayer(545): prepareAsync called in state 8
04-08 16:08:59.094: W/System.err(545): java.lang.IllegalStateException
04-08 16:08:59.104: W/System.err(545): at android.media.MediaPlayer.prepare(Native Method)
04-08 16:08:59.114: W/System.err(545): at com.example.kurak1.Kurak.playSound_Lov(Kurak.java:98)
04-08 16:08:59.114: W/System.err(545): at com.example.kurak1.Kurak$1.onClick(Kurak.java:64)
04-08 16:08:59.124: W/System.err(545): at android.view.View.performClick(View.java:3480)
04-08 16:08:59.134: W/System.err(545): at android.view.View$PerformClick.run(View.java:13983)
04-08 16:08:59.134: W/System.err(545): at android.os.Handler.handleCallback(Handler.java:605)
04-08 16:08:59.144: W/System.err(545): at android.os.Handler.dispatchMessage(Handler.java:92)
04-08 16:08:59.174: W/System.err(545): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-08 16:08:59.184: W/System.err(545): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-08 16:08:59.184: W/System.err(545): at dalvik.system.NativeStart.main(Native Method)
04-08 16:08:59.194: I/System.out(545): java.lang.IllegalStateException
04-08 16:08:59.194: I/System.out(545): ################## My log line end ####################


2) ######################################################
Methode:
1protected void playSound_Lov(int index) {
2
3 System.out.println("################## My log line startup ####################");
4
5 mp_lov = MediaPlayer.create(getApplicationContext(), songs_lov[index]);
6
7 System.out.println("A mp_lov.isPlaying() =" + mp_lov.isPlaying());
8
9 if(mp_lov != null && !mp_lov.isPlaying()){
10 try {
11 mp_lov.start();
12 } catch (IllegalStateException e) {
13 e.printStackTrace(); System.out.println(e.toString());
14 }
15 }
16 System.out.println("B mp_lov.isPlaying() =" + mp_lov.isPlaying());
17 System.out.println("################## My log line end ####################");
18 }

Debug B:
04-08 16:23:49.305: I/System.out(771): ################## My log line startup ####################
04-08 16:23:49.415: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:23:49.445: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:23:49.445: I/System.out(771): ################## My log line end ####################
04-08 16:24:00.675: I/System.out(771): ################## My log line startup ####################
04-08 16:24:00.775: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:24:00.805: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:24:00.805: I/System.out(771): ################## My log line end ####################
04-08 16:24:01.815: I/System.out(771): ################## My log line startup ####################
04-08 16:24:02.015: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:24:02.056: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:24:02.056: I/System.out(771): ################## My log line end ####################
04-08 16:24:02.415: I/System.out(771): ################## My log line startup ####################
04-08 16:24:02.565: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:24:02.595: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:24:02.595: I/System.out(771): ################## My log line end ####################
04-08 16:24:02.985: I/System.out(771): ################## My log line startup ####################
04-08 16:24:03.235: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:24:03.305: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:24:03.305: I/System.out(771): ################## My log line end ####################
04-08 16:24:03.456: I/System.out(771): ################## My log line startup ####################
04-08 16:24:03.845: I/System.out(771): A mp_lov.isPlaying() =false
04-08 16:24:03.885: I/System.out(771): B mp_lov.isPlaying() =true
04-08 16:24:03.885: I/System.out(771): ################## My log line end ####################
_____________________

Aber (es sind paar Minuten Tipperei - sonst Copy & Paste aus meinen Code) probiere es einfach selber aus.

Bevor Du aus Listing / Debug B was Ausschließt gucke auf die Zeitstempeln (Uhr)
Die Methode wurde in sehr kleinen Zeitabständen ausgerufen! (habe paar mall hintereinander aufs "Starten- Button" gedrückt! ...) Das bedeutet, dass mein Sound noch nicht richtig angefangen hat, und es kam das nächstes Song und dritter wurde gestartet (Lief ALLES Parallel)

Was auch immer, ich schreibe es auf den SoundPool um. und bin über den Bug des MediaPlayer Klasse überzeugt.

LG
Georg

— geändert am 08.04.2014, 19:02:12

Sorry für Gramatik & Stilistik Fehler.

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

08.04.2014, 19:27:33 via Website

Warscheinlich ist es nur ein Fehler in deinem unübersiochtlichen Code, den du noch nicht siehst, aber ich glaube soundpool passt auch.
Nur da wieder aufpassen, dass du nicht wieder 12 Objekte davon anlegst, sondern dann könnstest du die Struktur glich mitänern

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

Antworten
Georg C.
  • Forum-Beiträge: 235

08.04.2014, 20:07:20 via Website

Ok.
Danke Dir

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten