[Android]startActivity() Intent in einem AsnycTask mit ProgressDialog benutzen:

LostHero

Admiral Special
Mitglied seit
07.08.2006
Beiträge
1.597
Renomée
39
Standort
Osnabrück
Hallo,
hoffe hier gibt es den ein oder anderen, der mit Android vertraut ist, habe da nämlich ein Problem ;).

Ich versuche seit Tagen einen ProgressDialog zusammen zu frickeln, der so lange rödelt, bis eine weitere Activity vollständig erzeugt wurde (über einen startActivity() Intent).

Das Problem dabei ist nicht mal der ProgressDialog oder der AsyncTask an sich, sondern eher die Kombination aus allen.

Was ich habe:

Activity A erzeugt einen neuen Intent (bei Click auf ein ListItem) welcher in einem AsyncTask ausgeführt wird.
In diesem AsyncTask wird dann in der onPreExecute() ein indeterminate ProgressDialog erzeugt.

Sobald die Activity B fertig initialisiert wurde, soll sich der ProgressDialog beenden.



Soweit zum gewünschten Ablauf.
Dieser funktioniert auch soweit "problemlos". Das Problem an der ganzen Sache ist, dass der ProgressDialog zwar angezeigt wird, aber nicht animiert wird (das Rad dreht sich nicht).
Der Thread scheint also zu hängen, bis dann die Activity B fertig initialisiert wurde, dann verschwindet der ProgressDialog sofort und die View "switcht" zur Activity B :(.


Bei google konnte ich einige ähnliche Probleme finden, wo geraten wurde, den AsynchTask in die onCreate() Methode der Activity B aus zu lagern, dies führt bei mir jedoch zu unzähligen Exceptions die ich nicht gelöst bekomme.

Activity B besteht btw nur aus einer MapView (auf OSM adaptiert), muss also bei Erzeugung erstmal die MapTiles von OSM saugen, was ne Zeit dauert.


Hier noch Codeausschnitte aus Activity A und deren AsyncTask zum starten von Activity B:

Code:
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		// Get the item that was clicked
		Object o = this.getListAdapter().getItem(position);
		String keyword = o.toString();
		
		if (keyword.startsWith("Map")) {
//			Intent launch_traismap_Intent = new Intent(Trais.this, TraisMap.class);
//			Trais.this.startActivity(launch_traismap_Intent);
			new BackgroundWorker().execute(keyword);
		}


....

}


Und hier der Worker:

Code:
    private class BackgroundWorker extends AsyncTask<String, Void, Boolean> { 
    	
    	private ProgressDialog pd;
    	    	    	
		protected Boolean doInBackground(String... params) {
			if(params[0].startsWith("Map")) {
				Intent launch_traismap_Intent = new Intent(Trais.this, TraisMap.class);
				Trais.this.startActivity(launch_traismap_Intent);
			}else if(params[0].startsWith("POIs")) {
				Intent launch_pois_own_Intent = new Intent(Trais.this, PoisOwn.class);
				Trais.this.startActivity(launch_pois_own_Intent);
			}
			
			
			return true;
		}		
		
		
		/* (non-Javadoc)
		 * @see android.os.AsyncTask#onPreExecute()
		 */		
		protected void onPreExecute() {
			// Things to be done before execution of long running operation. For example showing ProgessDialog
			pd = ProgressDialog.show(Trais.this, "Bitte warten...", "Downloading Data...", true, false);
		}		
		
		
		/* (non-Javadoc)
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */		
		protected void onPostExecute(Boolean result) {
			// execution of result of Long time consuming operation
			pd.dismiss();
		}		
    }


Bin für jede creative Idee dankbar... :)
 
Hallo,

ich hatte das selbe Problem und hab es so lösen können:

Vorher:
PHP:
            		//-ProgressDialog starten, da Daten heruntergeladen werden
                    progressDialog.show();
              
                    //-Intent erstellen
            		startActivity(new Intent(this, Category.class));


Nacher:
PHP:
            //-Thread starten um GUI Thread nicht zum hängen zu bringen
            Thread t = new Thread() {
            	
            	//-Thread starten
                public void run() {
                	
                	//-Schleife vorbereiten
                    Looper.prepare();
                    
            		//-ProgressDialog starten, da Daten heruntergeladen werden
                    progressDialog.show();
              
                    //-Intent erstellen
            		startActivity(new Intent(Main.this, Category.class));
                    
                    Looper.loop();                
                }
            };
            
            //-Thread starten
            t.start();

Im onLoad() und onResume() habe ich noch
PHP:
        //-ProgressDialog vorbereiten, welcher geöffnet wird, wenn Daten heruntergeladen werden
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Bitte warten...");
        progressDialog.setIndeterminate(true);
        progressDialog.setCancelable(false);

stehen und der ProgressDialog muss noch mit
PHP:
//-ProgressDialog erstellen
	public static ProgressDialog progressDialog;
erstellt werden
 
Zuletzt bearbeitet:
hmm mir wurd immer gesagt, dass man in android Threads vermeiden soll, bzw die AsyncTasks bevorzugen soll (was im prinzip nix weiter als Threads sind).

ich werd deine variante mal testen, würde mich jedoch wundern wenn das nen unterschied macht.

wo/wie beendest du denn den ProgressDialog?
Also wo setzt du das ding auf progressdialog.dismiss() ?
Ich kann ja schlecht ne endlosschleife benutzen die ständig prüft ob der thread fertig ist (das würd den GUI thread wieder locken).



EDIT:

okay wow damit hätte ich jetzt nich gerechnet.
ich habe lediglich meinen AsyncTask in nen stink normalen Thread geändert (so wie von dir vorgeschlagen) und es funktioniert oO.

warum weiß ich zwar nicht, da selbst Google in den Android Beispielen alles mit AsyncTasks macht, aber das ist mir jetzt gerade schnurz piep egal! Dank dir für den tipp!
allerdings besteht das oben erwähnte problem mit dem dismiss() noch ;).
weil so dreht sich das Rad endlos lange.
 
Zuletzt bearbeitet:
Zurück
Oben Unten