Auf das Ende eines AsyncTasks warten

  • 2 Antworten
  • Letztes Antwortdatum
D

DiaBloB555

Neues Mitglied
0
Hallo,

ich habe folgendes Problem: Ich habe eine Funktion, in der ich einen AsyncTask ausführe, ich möchte nun jedoch, dass die Funktion erst "zu ende" ist, wenn der AsyncTask beendet ist. Hier der Code:

Code:
		    	final AsyncTask<String, Integer, String> WaitForTTSEngine = 
		    		new AsyncTask<String, Integer, String>() {
	
		    			@Override//Start TTS Engine
		    			protected void onPreExecute () {//Start new TTS Engine
		    				InAsyncTask = true;
		    				System.out.println("AsyncTask: \"WaitForTTSEngineInBG\": onPreExecute");
		    				StartNewTTSEngine();
		    			}
		    			
						@Override//Wait for TTS Engine
						protected String doInBackground(String... arg0) {//Wait for TTS Engine
		    				System.out.println("AsyncTask: \"WaitForTTSEngineInBG\": doInBackground"  + "\n");
		    					
							while (!TTSEngineIsReady) {
								System.out.println("Waiting for new TTSEngine");
								try {Thread.sleep(200);} 
								catch (InterruptedException e) {e.printStackTrace();}
									
							}
								
							if (TTSEngineIsReady) {System.out.println("TTSEngine Is Ready !"  + "\n");}
								
						return "Done";
						}
							
						@Override 
						protected void onPostExecute (String WrapperString) {//Use TTS Engine
		    				System.out.println("AsyncTask: \"WaitForTTSEngineInBG\": onPostExecute");
		    				System.out.println("Speaking..");
						    MyTTSEngine.speak(StringToSpeak, TextToSpeech.QUEUE_FLUSH, null);
						    InAsyncTask = false;
						}
		    	
		    	};
		    	WaitForTTSEngine.execute();

Meine "Lösung", die nicht geht..

   while (!InAsyncTask){ 
   Thread.sleep(10);
   }

//Ende der funktion

So funktioniert das jedoch nicht, hat jemand eine Idee ?
 
AsyncTasks dienen dazu, Code auszuführen, ohne den UI Thread anzuhalten/zu blockieren (die Oberfläche soll nicht einfriehren). Wenn du einen Async Task zu einem SyncTask machen willst, ist das ein deutliches Zeichen, dass mit deinem Design was nicht stimmt. :D

Was du aber machen kannst, ist einen Progressdialog für die Dauer des AsyncTasks zu öffnen - dann sieht der User auch, dass "etwas" passiert.
 
Zuletzt bearbeitet:
Ich kann der goldenen Mitte nur zustimmen ;)
Auch finde ich Thread.sleep() immer sehr grenzwertig, wenn man das irgendwo benutzt hat man meistens was falsch gemacht ;)

DIe TextToSpeech Engine von Google hat doch eine eigene Callback Methode
TextToSpeech.OnInitListener | Android Developers

Eigentlich musst du nur das Interface implementieren und kannst dann in der Methode die .speak methode aufrufen. (oder halt machen was du willst)
 
Zurück
Oben Unten