ProgressDialog als Dialog.. was mache ich falsch?

  • 14 Antworten
  • Letztes Antwortdatum
K

KaNuNSuZ_oFLu

Neues Mitglied
0
Hallo.. wieder ich :) tut mir leid, falls meine Fragen langsam zu lästig werden.. Schnell zu meinem Problem.. Und zwar habe ich eine App, die Daten aus dem Internet laden soll.. Nun dafür habe ich eine Methode initialise() geschrieben.. Nur möchte ich nicht, dass es während des Ladevorgangs einen schwarzen Bildschirm gibt.. Auch wenn es nur ganz kurz ist.. Deswegen dachte ich mir, ich programmieren einen Dialog.. Habe eine Methode geschrieben, die folgendermaßen aussieht...

Code:
private void makeMeWait () {
		if ((mySpinnerDialog== null) || (!mySpinnerDialog.isShowing())) {
			mySpinnerDialog= new Dialog(this);
	        mySpinnerDialog.getWindow().getCurrentFocus();
	        mySpinnerDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
	        mySpinnerDialog.setContentView(R.layout.loading);
	        mySpinnerDialog.setCancelable(false);
	        mySpinnerDialog.setOwnerActivity(this);
	        mySpinnerDialog.show();
	    } else {
	        mySpinnerDialog.setOwnerActivity(this);
	        mySpinnerDialog.dismiss();
	    }
	}

und so sieht meine initialise() Methode aus

Code:
	private void initialise() {    	
		makeMeWait();        
                      //... Code-Schnipsel
                      makeMeWait();

sprich ich umklammere die Methode initialise() mit der Methode makeMeWait()..

soll den Zweck haben, dass er bevor er der Methode beitritt den Dialog sichtbar machen soll.. und nachdem er ausgetreten ist, soll er wieder unsichtbar werden..

Nur funktioniert das ganze nicht wie ich es will... Irgendwie zeigt er mir gar nichts an.. ich dachte anfangs, dass ich gar nicht in die Methode makeMeWait() eintrete, aber doch ich trete ein.. Nur ist wahrscheinlich die App so schnell in der Methode,dass ich diesen Dialog gar nicht erst sehe.. So weit so gut, aber jetzt wollte ich mit Klick auf einen Button etwas neues Laden und während dieses Ladevorgangs auch einen Dialog anzeigen lassen.. Siehe da mit klick auf den button hängt sich das Programm für 1-2 sekunden auf (wahrscheinlich ladet es die Daten) und springt dann OHNE den Dialog-Fenster angezeigt zu haben, in die andere Activity..

Was mach ich hier eigentlich falsch? Kann mir jemand behilflich sein?
 
Da man deinen Schnipsel nicht sieht kann man nur Vermutungen aufstellen.

Meine Vermutung ist, das dein Download den GUI Thread Blockiert und deswegen dein Dialog nicht angezeigt wird bzw.. Du hast es nur nicht mitbekommen, da du sowieso einen schwarzen Bildschirm hattest.

Code:
... Siehe da mit klick auf den button hängt sich das Programm für 1-2 sekunden auf (wahrscheinlich ladet es die Daten)

Erklärt auch dieses Phänomen.

Downloads sollten prinzipiell in einen Thread ausgelagert werden, da sie bekanntlich unterschiedlich lange dauern.
 
  • Danke
Reaktionen: KaNuNSuZ_oFLu
vielleicht die ganze geschichte generell in ein Thread verpacken, dann sollte es laufen
 
  • Danke
Reaktionen: KaNuNSuZ_oFLu
Alles in einen Thread packen geht nur bedingt, da der Progress angezeigt werden soll. Das ist nur im GUI Thread möglich. Es gibt zwar einen Workaround mit einem Handler, aber Download im Hintergrund und Progressanzeige im GUI-Thread ist die einfachere denke ich.
 
ich hab das bei mir so verwirklicht das ich bevor der thread startet nich diesen Prozesslayout auf visible stelle und wenn er beendet ist auf hidden. du hast auch recht ich nutze dafür den uithread
 
Genau für diesen Zweck gibt's ja den AsyncTask.

Gesendet von meinem MB525 mit Tapatalk 2
 
Wohl war, das ist die beste Lösung dafür.
 
Also wenn ich das jetzt richtig verstanden habe, soll ich die Methode makeMeWait() in einen uithread oder asynctask packen?

Gesendet von meinem Galaxy S2 mit der Android-Hilfe.de App

Der ursprüngliche Beitrag von 12:36 Uhr wurde um 13:48 Uhr ergänzt:

Unicate schrieb:
Da man deinen Schnipsel nicht sieht kann man nur Vermutungen aufstellen.

Meine Vermutung ist, das dein Download den GUI Thread Blockiert und deswegen dein Dialog nicht angezeigt wird bzw.. Du hast es nur nicht mitbekommen, da du sowieso einen schwarzen Bildschirm hattest.

Code:
... Siehe da mit klick auf den button hängt sich das Programm für 1-2 sekunden auf (wahrscheinlich ladet es die Daten)

Erklärt auch dieses Phänomen.

Downloads sollten prinzipiell in einen Thread ausgelagert werden, da sie bekanntlich unterschiedlich lange dauern.

z.B. dieser Schnipsel..


Code:
        // Click event for single list row
        list.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				makeMeWait();
				
				Intent in = new Intent(FirstActivity.this,SecondActivity.class);
				in.putExtra("id", adapter.getItemID(position));
				in.putExtra("title", adapter.getItemTitle(position));
				in.putExtra("short_description", adapter.getShortDescription(position));
				in.putExtra("full_description", adapter.getFullDescription(position));
				in.putExtra("image", adapter.getItemIcon(position));
				startActivity(in);
				
				makeMeWait();
			}
		});

Ist da ein Asynctask eine Lösung? Wenn ja, wie muss ich diesen ansetzen?
 
  • Danke
Reaktionen: KaNuNSuZ_oFLu
so wie ich das verstanden habe, soll ich meine initialise() Methode als ein AsyncTask implementieren? Sprich in der doInBackground() Methode soll ich erst den ProgressDialog zeigen.. also progressdialog.show() und in die onPostExecute() Methode soll dann progressdialog.dismiss() ausgeführt werden.. Habe ich das richtig verstanden? Wenn ja, ich verstehe die ganze Parameter geschichte nicht ganz.. ich brauche keine Parameter für meine Methode.. Kann ich einen aSync task nicht ohne parameter implementieren?
 
Nein, das geht nicht, ist aber auch nicht schlimm.

schreib einfach "Object " mit in die Objectdefinition und ignorier sie dann einfach.

aufgerufen wird dann mit execute().

Der ProgressDialog#show() muss vor dem execute kommen, damit du das im GUI Thread machst. (ProgressDialog#doInBackground() wird NICHT im GUI-Thread gemacht, wie man unschwer überlesen kann)

ProgressDialog#dismiss() kann im "onPostExecute" kommen, da dieser auch im GUI-Thread ausgeführt wird.
 
  • Danke
Reaktionen: KaNuNSuZ_oFLu
Man benutzt einfach Void, wenn man keine Paramter benötigt.
 
Ist das nicht egal? Ich mein Void ist auch nur von Object abgeleitet.
 
naja prinzipiell ist das egal

aber void zeigt an, dass hier nichts weiteres nötig ist.

du gibst deinen code weiter und der sieht Object. denk sich - super, da brauch ich einen Parameter - aber welchen ?

Oder so ähnlich. Denke mit Void ist es eindeutig
 
  • Danke
Reaktionen: KaNuNSuZ_oFLu
Hat alles mit asynctask bestens funktioniert.. Danke euch allen :)

Gesendet von meinem X10i mit der Android-Hilfe.de App
 
Zurück
Oben Unten