• Hallo zusammen,


    ich habe ein Problem mit meinem Lifecycle.
    Ich rufe von einer Activity die zxing Barcodescanner App auf.


    Java
    this.intentIntegrator = new IntentIntegrator(this);
     this.intentIntegrator.initiateScan();


    Hier die Methode im IntenIntegrator:


    und dann geht der Spaß los. im onActivityResult verarbeite ich das Ergebnis:



    ich schiebe den Barcode in einen Hintergrundprozess, wo er an einen SOAP Service geschickt wird. Genau hier habe ich das Problem.
    Hier wird in der Ursprungs-Activity ab und an das onDestroy(nicht immer) aufgerufen und somit wird meine wepApi null:


    Hier hängt sich meine App natürlich auf. Ich vermute ja, dass Android aufgrund von Speicherplatz einfach meine Ursprungs-Activity killt. Aber wie gehe ich dagegen vor? Kann ich das irgendwie verhindern? Oder habe ich eine Möglichkeit meine webApi zu sichern?


    Viele Grüße
    Christian

  • Der Aufruf von onDestroy ist nur etwas für abschließendes Aufräumen, nachdem schon alles zu Ende ist. Das kann manchmal viel später passieren, nachdem die Activity schon weg ist.


    Vor onDestroy kommt immer noch onPause - da solltest du die Sachen besser reinpacken. Das ist nämlich der Zeitpunkt, bevor die Activity von der Anzeige verschwindet - und mit ihr alle View-Elemente.


    Und die entsprechenden Aufbauarbeiten (Listener und Service binden) in onResume, dann sollte es zusammen passen...

  • Er läuft natürlich trotzdem in das onDestroy() rein. Und daraus folgt natürlich dass alle Klassenvariablen null werden. Somit auch meine webApi. Das seltsame ist aber, dass es nicht immer der Fall ist. Die Chance steht aber 70/30, dass onDestroy() aufgerufen wird :)
    Auch dein Tipp konnte mir daher leider nicht helfen :/


    Edith sagt:
    Hab nochmal mit ganz kleinen Schritten durchdebugged. In dem Moment, in dem ich einen Barcode eingescannt habe(die Activity wurde also schon lange verlassen), wird erst das onDestroy() der Ursprungs-Activity aufgerufen. Was aber wie gesagt nicht immer passiert. Wenn es aber eintritt, dann gleich mehrmals hintereinander. Sehr sehr skuril

  • sorry, da hatte ich mich etwas unklar ausgedrückt...


    onDestroy() passiert tatsächlich irgendwann viel später - nämlich wenn Android Speicherplatz braucht. Und das kann Stunden später sein. Und dann auch gerne für mehrere alte Instanzen auf einmal.


    Was aber auf jeden Fall vorher aufgerufen wird (wenn du die Methode implementierst), ist onPause()- und zwar genau dann, wenn die aktuelle Activity nicht mehr sichtbar ist und etwas anderes angezeigt wird.


    In onPause() solltest du den Code eintragen statt in onDestroy(). Entspechend solltest du den Service in onResume() aktivieren.


    Infos dazu findest du in der Android-Doku.


    Und ich schreibe das super.onDestroy() immer am Ende von onDestroy() - ich will erst selber was machen, bevor mir die Superklasse dazwischen fummelt.

  • Hab eben den Fehler gefunden. Beim Kippen des Telefons wird onDestroy() aufgerufen. Da ich das Telefon zum Scannen drehen muss, hing es immer davon ab, ob ich das Telefon vor oder nach dem Öffnen des Barcodescanner Apps gedreht habe :D
    Was ein blödes Problem...
    Mit android:configChanges="orientation|keyboardHidden" verhinder ich, dass dies geschieht. Zack alles läuft. Da macht man sich Tage lang Gedanken und dann liegt es an so etwas bescheuertem.
    Trotzdem danke für die Hilfe :)


    Edit:
    Der Code der im onDestroy() liegt, entfernt nur den Listener aus meiner webApi. Setzt sie aber nicht komplett null. Da hatte ich mich wohl schlecht ausgedrückt :)
    Und das soll eben dort liegen.

Jetzt mitmachen!

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