AsyncTask bricht ab wenn ich das Handy drehe?

  • Antworten:12
Ben Becker
  • Forum-Beiträge: 209

16.09.2011, 14:18:08 via Website

Hiho!
Wenn das Handy gedreht wird, dann startet die App ja neu. Leider bricht dann auch mein AsyncTask ab und die App stürzt App. Daher habe ich erst mal die Orientierung fest gesetzt. Gibt es hier eine Möglichkeit, dass der AsyncTask weiter läuft und die Ansicht sich trotzdem dreht? Während des AsyncTask werden Daten aus dem Internet abgerufen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

16.09.2011, 14:45:47 via Website

Eigentlich wird nur Deine Activity restarted - nicht der AsyncTask. Ich vermute das Deine App abstürzt weil Du aus dem AsyncTask auf nicht mehr existierende oder geänderte UI Elemente zugreifst.

Setz einfach im Manifest hinter die betreffende Activity folgende Parameter:

1<activity android:name="DeineActivity" android:configChanges="orientation|keyboardHidden"></activity>

Dadurch wird diese Activity nicht abgeschossen und neu gestartet sondern es werden nur die Layout Änderungen durchgeführt. Du wirst über diesen Hack viel Negatives lesen. Ich bin da ganz anderer Meinung. 99,9% aller Entwickler bewegen sich mit ihren Layouts in ganz einfachen Regionen. Das klappt hiermit hervorragend. Nur wenn richtig komplexe Anpassungen, tiefe Eingriffe in das Layout, notwendig sind dann würde ich es anders lösen. Für diesen Fall gibt es diverse Lösungen.

Zum Beispiel 1: Siehe hackbods Kommentar in diesem Thread. Hinter hackbod versteckt sich Ms. Dianne Kyra Hackborn, DIE Framework Entwicklerin im Android Team:

http://stackoverflow.com/questions/5335665/avoid-reloading-activity-with-asynctask-in-orientation-change-in-android

Zum Beispiel 2: http://www.fattybeagle.com/2011/02/15/android-asynctasks-during-a-screen-rotation-part-ii/

Antworten
Ben Becker
  • Forum-Beiträge: 209

16.09.2011, 15:12:52 via App

ja das habe ich in der Manifest schon drin. dann dreht sich aber ja gar nichts mehr. Was habe ich dann falsch? also das der User die App trotzdem drehen kann.

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

16.09.2011, 16:12:24 via Website

Dann hast Du das irgendwo fest verdrahtet. Deine Activity zeigt dann nur vertikal oder horizontal - egal wie der Benutzer sein Device hält.

Antworten
ECR
  • Forum-Beiträge: 72

19.08.2012, 12:55:35 via Website

Dieser Thread ist zwar schon etwas älter habe mein Problem geht in diese Richtung.

Ich habe hier das Beispiel gesehen(http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange) mit diesem Manifest Befehl

1android:configChanges="orientation|keyboardHidden"

Leider haut das bei mir nicht hin. Ich kann weiterhin das Telefon kehren und dann stürzt das Programm ab. Im Hintergrund läuft ein AsnyTask, was ja aber keine Rollen spielen sollte da der Befehl es ja eigentlich verhindern sollte das die App neugestartet wird.
Das komische ist nachdem die Daten runtergeladen und wurde, und ich das telefon drehe, beginnt der Download wieder. Also bei jedem drehen wird die App neu gestartet. Aber der Befehl mit dem configChanges sollte das doch verhindern?

Hier mein Code:

1<application
2 android:icon="@drawable/ic_launcher"
3 android:label="@string/app_name"
4 android:theme="@style/AppTheme" >
5 <activity
6 android:name=".MainActivity"
7 android:configChanges="orientation|keyboardHidden"
8 android:label="@string/title_activity_main"
9 >

Antworten
ECR
  • Forum-Beiträge: 72

19.08.2012, 13:56:48 via Website

Ich habe es rausgefunden. Seit Api3.2 muss man nun auch screenSize hinzufügen, nun klappt es.

android:configChanges="orientation|screenSize

Antworten
Ultimate Software
  • Forum-Beiträge: 110

19.08.2012, 16:19:36 via Website

Kennt einer von euch ne Möglichkeit nur temporär das umschalten zu verhindern? Ich habe eine Datenübertragung während der es auch stören würde, wenn die App neu startet. Ich würde das Drehen gerne so lange sperren und wenn die Datenübertragung vorbei ist es wieder frei schalten.

<td class="alt1"> <!-- google_ad_section_start -->Mehrere WLANs?? Versuch doch mal den <a href="http://goo.gl/7ojEp&quot; target="_blank">SSID Selector</a>: <img src="images/smilies/extra/thumbsup.gif" border="0" alt="" title="Thumbsup" class="inlineimg" /><!-- google_ad_section_end --> </td>

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

19.08.2012, 16:52:52 via Website

Das ist der absolut falsche Ansatz.

* Nicht die App wird beim Drehen beendet sondern die Activity.

* Nicht der Thread/Task wird beendet sondern die Activity.

Das Geheimnis einer Lösung ist: Nach dem Drehen werden der weiterhin laufende Thread/Task und die neu gestartete Activity zusammen geführt. Ich habe in dem Forum "Code Snippets" (zwei Foren weiter) zwei komplette Lösungen mit AsyncTask, Activity, ProgressDialog gepostet - einmal AsyncTask als InnerClass, einmal als separate Klasse.

Ich habe schon in diversen Threads darauf hingewiesen das die Parameter-Kette im Manifest im Laufe der Android Release verändert wird. Sollte das erneut passieren so werden Apps, die mit diesen Manifest-Parametern arbeiten, plötzlich nicht mehr auf neuen Geräten laufen. Die Lösung in den "Code Snippets" ist unabhängig davon.

— geändert am 19.08.2012, 16:53:57

Markus B.

Antworten
Ultimate Software
  • Forum-Beiträge: 110

19.08.2012, 23:12:46 via Website

Naja, das Problem bei mir ist aktuell, dass ich die Daten des aktuell laufenden Transfer benötigen würde um die GUI neu aufzubauen. Da die Datenmenge recht hoch ist möchte ich sie (wie jetzt) vor dem Laden "wegwerfen" und nicht doppelt halten, was ich tun müsste um die GUI mit den alten Daten vorrübergehend aufzubauen.

<td class="alt1"> <!-- google_ad_section_start -->Mehrere WLANs?? Versuch doch mal den <a href="http://goo.gl/7ojEp&quot; target="_blank">SSID Selector</a>: <img src="images/smilies/extra/thumbsup.gif" border="0" alt="" title="Thumbsup" class="inlineimg" /><!-- google_ad_section_end --> </td>

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

20.08.2012, 07:03:05 via App

Was machst Du wenn der Benutzer während des Transfers eine andere App in den Vordergrund holt und wieder zu Deiner App zurückkehrt?

Ich würde dem Benutzer einfach eine leere Activity mit einem ProgressDialog anzeigen. Wenn dann der Thread fertig ist verschwindet der Dialog und die Daten werden angezeigt.

Deine Anforderung ist nichts Neues. Tausende Apps haben es schon auf diese Weise gelöst. Die Benutzer kennen das.

Antworten
Ultimate Software
  • Forum-Beiträge: 110

20.08.2012, 17:25:53 via Website

Ja, das ist ein 2-seitiges Schwert, darüber hab ich auch mit Google-Dev's schon philosophiert.... bei 50% der Anwender geschieht die Datenübertragung schnell, da wäre eine leere Activity störend, weil sie zu einem unschönen "zucken" führt, bei anderen dauert es länger, da wäre es OK. Man hat mir jetzt zur Zwischenlösung geraten: Progress-Icon oben rechts (falls es mal länger dauert) aber die Acitivity erst neu aufbauen wenn die Daten da sind...... das funktioniert super..... bis auf die Drehung..... deswegen meine Frage: Kann man das Drehen kurzfristig sperren? Dazu hat noch keiner was gesagt..... ein "geht nicht" wäre ja auch OK, dann muss ich mir was anderes überlegen.

<td class="alt1"> <!-- google_ad_section_start -->Mehrere WLANs?? Versuch doch mal den <a href="http://goo.gl/7ojEp&quot; target="_blank">SSID Selector</a>: <img src="images/smilies/extra/thumbsup.gif" border="0" alt="" title="Thumbsup" class="inlineimg" /><!-- google_ad_section_end --> </td>

Antworten
Carsten M.
  • Forum-Beiträge: 33.204

20.08.2012, 18:09:48 via App

Ultimate Software
Frage: Kann man das Drehen kurzfristig sperren? Dazu hat noch keiner was gesagt..... ein "geht nicht" wäre ja auch OK, dann muss ich mir was anderes überlegen.
Das geht definitiv. Ich mache das genau so, beim Download von größeren Datenmengen.

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

bzw. ActivityInfo.SCREEN_ORIENTATION_PORTRAIT

müsste das sein...

Herzliche Grüße

Carsten

Ich komm' mir langsam vor wie jemand, der ich bin // #cäthe

Antworten