Crash beim Drehen

  • Antworten:8
jens vattel
  • Forum-Beiträge: 33

02.03.2011, 12:25:20 via Website

Hallo,
Folgendes Problem.
Einen kleine App, die einen Dialog anzeigt. Dieser Dialog zählt mit AsyncTask einen Wert runter und zeigt ihn an.
Danach wird der Dialog automatisch beendet (man kann auch noch auf einen OK-Button drücken um den Countdown zu beendet).
Wenn ich die App aber mit dem angezeigten Dialog drehe (habe ein anderes Layout für landscape) geht das 2-3 mal gut, aber dann brasht die App/Activity.

Ich habe schon rausgefunden, das das ganze am AsyncTask liegt, wenn ich den nicht starte, gehts. Ich rufe auch bei activity.onStop das dismiss für den Dialog auf und stoppe dort den Task . Das bringt aber nichts. Das Chrashen kann ich nicht verhindern.
Hat vieleicht jemand schon mal das Problem gehabt, oder ne Idee, was ich noch machen könnte?


Jens

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

02.03.2011, 12:43:12 via Website

Hatten wir letztens schonmal so eine Frage.

Problem ist, dass man Views in einer sich grade schliessenden, oder bereits geschlossenen Activity nicht manipulieren kann.

1. solltest Du schon bei onPause() weitere Zugriffe durch den AsyncTask verhindern, weil das die letzte Methode ist, die GARANTIERT aufgerufen wird, wenn eine Activity sich schliesst. onStop() und onDestroy() eigentlich auch, jedoch kann die Android VM in Ausnahmefällen mal davon absehen.

2. solltest du vor der Veränderung der Views mit isFinishing() abfragen, ob sich die Activity grade schliesst.

Kombination aus 1+2 sollte schon helfen.

Antworten
jens vattel
  • Forum-Beiträge: 33

03.03.2011, 11:53:29 via Website

Hilft leider auch nicht :-(

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

03.03.2011, 11:58:09 via Website

AsyncTask bietet eine cancel methode, diese kannst du z.b abfragen im Task! Zumindest verhindert das du damit das "Alte UI" versuchst upzudaten.
Du kannst das drehen auch selbst managen, und dem AsyncTask einfach nach dem drehen enstprechend die neuen UI referenzen übergeben.
Man kann das drehen über die Manifest Datei nicht erlauben.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
jens vattel
  • Forum-Beiträge: 33

03.03.2011, 23:14:07 via Website

Ich habe mal das ganze Eclipse-Projekt gepackt :


http://heinrika.de/Dreh.rar

Das ist nur der reine Dialogcode, beim Drehen gibts da auch ein Crash.
isFinishing() ist bei mir immer false.

Wer bekommt diesen Code drehbar? :-)

Antworten
Andy N.
  • Forum-Beiträge: 3.112

04.03.2011, 11:22:59 via Website

Füge am Ende der onPause() ein super.onPause(); ein, dann sollte es gehen:
1@Override
2 public void onPause()
3 {
4 dismissDialog(1);
5
6 super.onPause();
7 }

EDIT:
Da scheint immer noch etwas falsch zu laufen

— geändert am 04.03.2011, 11:29:49

Antworten
jens vattel
  • Forum-Beiträge: 33

04.03.2011, 21:28:40 via Website

das super.onPause() hatte ich im Original drinn, nur hier im Demo vergessen.

Ohne super.onPause() stürzt die App beim drehen gleich ab, mit super.onPause() gehts
ein paar mal, bevor es crasht :-(

Gruss Jens

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

07.03.2011, 09:58:28 via Website

OK dann mach es doch einfach so, dass in der Zeit in der ein Progress läuft die Formatumschaltung "eingefroren" wird.
Das ist IMHO ein guter Mittelweg, um solchen Problemen von vornherein aus dem Weg zu gehen.

1setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)

reicht schon. Danach dann zurücksetzen auf SCREEN_ORIENTATION_USER o.ä.

Alle möglichen Werte findest du in der offiziellen Doku.

Antworten