App nach Android-Update fehlerhaft

  • Hallo leute,


    iich habe eine app programmiert, welches musik abspielt. beim abspielen gibt es auch bilder zurück, die in den app-internen ressourcen gespeichert sind. die musikdateien befinden sich im res/raw ordner. die bilder können mittels eines buttons gewechselt werden.


    wenn ich auf den button zum abspielen der musik klicke kommen folgender log-eintrag


    wenn ich auf den button zum wechseln des bildes klicke erscheint folgender eintrag:


    zum beenden habe ich eine onklick-methode eines buttons folgendermaßen definiert:

    Code
    public void QuitKlick(View v) {
    		if(mp.isPlaying() || mp != null) {
    			mp.stop();
    			mp.release();
    			mp = null;
    		}
    			this.finish();


    trotzdem bekomme ich eine exception wenn ich auf den button klicke:



    was ich nicht verstehe, als ich fertig mit der app war, funktionierte sie einwandfrei ohne jegliche fehler. aus neugier habe ich mal die app nach langer zeit wieder (auf meiner neuen android-version 4.1.2) ausgeführt und habe plötzlich die oben genannten probleme. ;(


    komischerweise funktioniert es ohne fehler auf dem emulator. woran kann das liegen? am telefon selbst? oder doch am code?

  • Code
    03-15 08:58:57.624: E/AndroidRuntime(29460): Caused by: java.lang.NullPointerException
    03-15 08:58:57.624: E/AndroidRuntime(29460): 	at fb1907.de.SongList.QuitKlick(SongList.java:55)
    03-15 08:58:57.624: E/AndroidRuntime(29460): 	... 14 more


    Das dürfte ein Folgefehler des Memory-Problems sein: irgend etwas, dass in SongList.java Zeile 55 gebraucht wird, ist null.
    Vermutlich, weil kein Speicherplatz mehr zur Verfügung stand.


    Wie macht man sowas eigentlich mit der GC? Ich kann ja nix von Allein freigeben oder so.
    (Dinge, die ich nicht verstehe. ^^)


    Code
    public void QuitKlick(View v) {
    	if(mp.isPlaying() || mp != null) {
    		mp.stop();
    		mp.release();
    		mp = null;
    	}
    	this.finish();
    }


    Tausch' mal das Auftreten in der IF-Abfrage. Du fragst erst 'Spielt der MusicPlayer noch?' und dann 'Ist der MusicPlayer null?'.
    Was passiert, wenn der MusicPlayer null ist? Genau: NullPointerException.


    Die IF-Abfrage greift oftmals schon nach Überprüfung der ersten Option. Und das ist von links nach rechts. (Im Gegensatz zu Variablenzuweisungen, die ja von rechts nach links gehen.)
    Bei einer Und-Abfrage solltest du also zuerst auf != null prüfen und dann die Methode checken.


    Übrigens halte ich die Oder-Abfrage dort für falsch, es sollte eine Und-Abfrage sein.
    Denn wenn mp == null kann mp.isPlaying() ja niemals wahr sein. Ebenso wenig kannst du die Wiedergabe stoppen oder irgendwas releasen. Und null = null ist ebenfalls eine sinnlose Zuweisung.


    Mach daraus lieber ein

    Code
    public void QuitKlick(View v) 
    {
    	if(mp != null && mp.isPlaying())
    	{
    		mp.stop();
    		mp.release();
    		mp = null;
    	}
    	this.finish();
    }


    Wenn jetzt mp==null, kann diese Und-Abfrage niemals wahr sein und wird auch gar nicht weiter geprüft, es wird also sofort this.finisch() aufgerufen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • hallo lucas,


    vorweg: was meinst du mit GC?? :)


    in zeile 55 steht die if-bedingung, also: if(fb1907.de.MainActivity.mp.isPlaying() && fb1907.de.MainActivity.mp != null) {


    also nehmen wir an der mediaplayer spielt eine musik bis zum schluss ab. wenn diese mit dem abspielen fertig ist, ist diese nicht null. diese muss durch andere methoden freigegeben werden (so kenne ich das). das möchte ich mit der if bezwecken. wenn die musik gespielt wird oder bereits abgespielt wurde aber nicht leer (also freigegeben) ist, dann sollen die entsprechenden methoden ausgeführt werden. deswegen habe ich dort auch eine oder-abfrage, weil wenn du musik abgespielt wird, ist mp ja nicht null. das heißt, wird musik abgespielt, dann stoppen, releasen etc. Oder wenn musik abgespielt wurde aber mp nicht null ist , dann die gleiche show nochmal. wenn mp == null ist, wird die if nicht ausgeführt. O:-)



    NACHTRAG


    habe in der if die fb1907.de.MainActivity.mp.isPlaying() entfernt und überprüfe jetzt nur ob der mp != null ist und siehe da es geht. ein Problem weniger :)

  • GC = Garbage Collector


    das ist die Automatik von java welche den Speicher aufräumen soll und nicht benutze Variablen,Bilder,Reservierungen was auch immer wieder freigibt.



    Zitat


    habe in der if die fb1907.de.MainActivity.mp.isPlaying() entfernt und überprüfe jetzt nur ob der mp != null ist und siehe da es geht. ein Problem weniger :)


    Ich glaube Lucas ging es mehr um die Reihenfolge und nicht ums weglassen


    mp.isplaying und gleichzeit auf null prüfen funktioniert so nicht !


    Warum?


    Wenn du auf die Eigenschaft mp.isPlaying zugreifst, obwohl Objekt mp schon gar nicht mehr da ist (also null), dann bekommst du eine Nullpointer exception.


    Besser wäre also nacheinander prüfen :


Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!