Ladebildschirm .... ?

  • Antworten:6
p a
  • Forum-Beiträge: 131

31.10.2011, 16:20:51 via Website

Hi,

ich weiss leider noch nicht einmal genau was ich suche, also unter was für Begriffen ich finde was ich suche.
Darum denke ich mir mal "Menschen sind da cleverer als Suchmaschinen" und poste hier.

Meine läd beim starten eine größere Menge Daten in die Datenbank und macht vorher noch einen Abgleich mit einem Server, daher würde ich gern einen Lade- oder Startbildschirm anzeigen während die Daten geladen und eingetragen werden.
Kann mir da wohl mal jemand eine Richtung weisen, wo ich sowas finde oder überhaupt wonach ich da konkret suchen soll/muss

Antworten
p a
  • Forum-Beiträge: 131

31.10.2011, 18:17:37 via Website

ah ok, danke
das war schonmal prinzipiell hilfreich ...
verbleibt allerdings folgendes Problem, also mein Code sieht so aus
1ProgressDialog dialog = ProgressDialog.show(this, "", "Initialisierung");
2Json.allesLesen(this);
3dialog.dismiss();
und das Json.allesLesen() ist natürlich die langwierige Methode, wenn ich die App jetzt im Emulator starte bleibt der Bildschirm allerdings erstmal lange schwarz, wohl während er das JSon liest, und anschliessend zeigt er den normalen Screen auf dem dann der ProgressDialog zusehen ist.
Von der Logik her sollte er doch aber den Dialog zeigen, dann das aufwendige allesLesen ausführen und danach den dialog wieder dismissen oder sehe ich das falsch?

Hab auch schon gegoogelt und so, find aber immer wieder nur ähnliche Beispiele die mir eben diese Vorgehensweise zeigen.

— geändert am 31.10.2011, 18:19:32

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

31.10.2011, 20:42:49 via Website

So geht das nicht.

Deine drei Zeilen befinden sich im selben Thread - dem UI Thread. So wird der Dialog nicht aufgebaut da keine weiteren Messages verarbeitet werden bis die Daten geladen wurden. Das gehört in einen separaten Thread z.B. in einen AsyncTask. Im Beispiel unten verwende ich einen eigenen ProgressDialog - an den beiden Stellen kannst Du dann Deinen eigenen nehmen.

Da die Activity beim Orientation Change abgeschossen wird - der Dialog und der Thread aber nicht - wird der Dialog runtergefahren und direkt wieder aufgebaut. Anschließend wird der Context (Activity) im Thread ausgetauscht und in der Folge im onPostExecute verwendet.

1public class MyActivity extends Activity {
2
3 private class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {
4
5 private MyActivity context;
6 private MyProgressDialog dialog;
7
8 public MyAsyncTask(MyActivity context) {
9 super();
10
11 this.context = context;
12 }
13
14 @Override
15 protected Boolean doInBackground(Void... voids) {
16 Boolean rc = false;
17
18 // Hier Deine Daten laden und im Glücksfall rc = true;
19
20 return rc;
21 }
22
23 @Override
24 protected void onPostExecute(Boolean result) {
25 if (dialog != null) {
26 dialog.dismiss();
27 dialog = null;
28 }
29
30 if (result) {
31 context.machWeiter();
32 }
33
34 context.loadTask = null;
35 }
36
37 @Override
38 protected void onPreExecute () {
39 dialog = MyProgressDialog.show(context, null, null, true, false);
40 }
41 }
42
43 private MyAsyncTask task;
44
45 @Override
46 public void onCreate(Bundle bundle) {
47 ...
48 // Wenn Task beim Orientation Change aktiv war Context neu setzen und Dialog wieder aufbauen
49 task = (MyAsyncTask) getLastNonConfigurationInstance();
50 if (task != null) {
51 task.context = this;
52 task.dialog = MyProgressDialog.show(this, null, null, true, false);
53 } else {
54 task = new MyAsyncTask(this);
55 task.execute();
56 }
57 }
58
59 @Override
60 public Object onRetainNonConfigurationInstance() {
61 // Wenn Dialog beim Orientation Change aktiv --> Loeschen
62 if (task != null) {
63 if (task.dialog != null) {
64 task.dialog.dismiss();
65 task.dialog = null;
66 }
67 }
68
69 return task;
70 }
71
72 private void machWeiter() {
73 // Hier nach Datenverarbeitung weiter machen
74 }
75}

Gian U.p a

Antworten
p a
  • Forum-Beiträge: 131

09.11.2011, 14:44:12 via Website

Jo, das funktioniert so, danke, sehr ausführlich und trotzdem musst ich noch selber denken und verstehen, hat mir sehr geholfen.
Kann hier leider nur einen "Daumen hoch" dafür geben, aber darfst dir gerne noch 4 weitere Daumen hoch dazudenken.

... und mal direkt die nächste Frage, wie verhinder ich dass man mit der Zurück-Taste wieder auf dem Ladebildschirm landen kann.

Also bei mir ist das so:

Android -> Ladebildschirm -> Hauptbildschirm

und zurück ist natürlich das Selbe nur umgekehrt, ich hätte es aber gerne so dass beim zurück gehen der Ladebildschirm übersprungen wird, also:

Android <- Hauptbildschirm

— geändert am 09.11.2011, 17:24:40

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.11.2011, 17:47:55 via App

Naja, indem du den Ladenbildschirm schließt, wenn du die HauptActivity startest. Also startActivity(intent_zur_Haupt) und danach finish();
Lg Ansgar

Antworten
p a
  • Forum-Beiträge: 131

09.11.2011, 17:58:56 via Website

Ahhh ok, danke
Hätte ich auch selber draufkommen können :*)

Antworten