Android ringProgressDialog nach Erfolg Button einfärben

BergJava

Aktives Mitglied
Hallo, ich kommunizier mit einer Seriellenschnittstell , um das warten für das Auge aufzuwerten haben ich ein:

Java:
public void verbinden(View v) {
    	final ProgressDialog ringProgressDialog = ProgressDialog.show(MainActivity.this, "Please wait ...", "Connecting...", true);
    	 ringProgressDialog.setCancelable(true);

eingefügt im run() steht das was er ab arbeiten soll:

Java:
 new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				
				try{//Ist Geräte da/Verbingen usw

                               }catch (Exception e){
					
					 
				}
				
		       		 
			
				 if(ringProgressDialog.isShowing()){
					 
					
					ringProgressDialog.dismiss();
					
				}
			
				
			}
		}).start();

Nun zur Frage, wo muss ich den Befehl reinschreiben, das wenn ringprogress beendet und Verbindung besteht:
Java:
((Button) findViewById(R.id.bt_verbinden))
		             .setBackgroundColor(Color.GREEN);
Danke
 
Argh... Auch wenn ich am Ende ungefähr verstehe (ich hoffe es zumindest), was du willst, sei mir eine Bitte gestattet: Bevor du einen Post absetzt, liess ihn bitte noch mal durch! Teilweise schreibst du mehrere Sätze in einem "Satz" zusammen, so dass es schlich schwer fällt, der eigentlichen Frage zu folgen (z.B. was jetzt eigentlich das #run mit dem Dialog zu tun hat). Und auch die Flektion einiger Worte... Ach lassen wir das. Wahrscheinlich regst du dich bereits jetzt schon auf, dass ich dich fernab vom Thema kritisiere... :-(

Zum Thema:
Verwende für solche Konstrukte, wie deinen Fall hier, am Besten einen AsyncTask.
In der Quellcode-Dokumentation von Goolge findet sich bereits ein erstes Beispiel, aber auch Lars Vogel hat dazu ein gutes Tutorial (der Link zeigt konrekt auf den Teil des Tutorials, der sich mit AsyncTask befasst, aber vielleicht wäre es auch ratsam, den Rest des Tutorials durchzulesen. Da stehen noch so einige interessante Dinge drin!).

Grundsätzlich - und das machst du ja schon richtig - macht man rechenintensive oder langlaufende Prozesse nicht auf dem Hauptthread, dem sog. UI-Thread, sondern wie du in einem eigenen. Wie man von diesem Thread aus die UI updated, geht am einfachsten, indem du dir den zu updatenden View schon mal in eine Variable speicherst. Borvor du etwas damit machst, solltest du überprüfen, ob die Activity überhaupt noch angezeigt wird (bitte selbst danach suchen). Anschliessend kannst du auf allen von View abgeleteiten Klassen eine Runnable per #post-Methode an den zu updatenden View schicken - dieser wird dann ASAP ausgeführt.
Wahrend das möglich wäre, würde ich dir aber dennoch davon abraten und lieber einen AsyncTask verwenden.
Im Kontruktor deiner AsyncTask-Klasse oder in der #onPreExecute-Methode kannst du einen ProgessDialog initialisierne (so wie du es schon gemacht hast). Die #doInBackground-Methode ist das äquivalent zu deiner #run-Methode in deinem Thread.
Die #doInBackground-Methode ist die einzige, die in einem eigenen Thread ausgeführt wird! ALLE anderen #on<irgendwas>-Methoden laufen auf dem UI-Thread.
Das bedeutet, wenn du von #doInBackground die UI - z.B. den Fortschritt im ProgressDialog - anzeigen möchtest, sendest du in #doInBackground deinen aktualierten Stand mittels der #publishProgress-Methode ab. Behandeln tust du diese Nachricht dann in #onProgressUpdate. Ist deine Arbeit abgeschlossen, kannst du in #doInBackground ein eventuell nötiges Ergebnis zurückgeben. Das wird dann von der #onPostExecute empfangen.
In dieser Methode kannst du dann den ProgressDialog entfernen und deine Farbe auf dem Button setzen.

Noch ein Hinweis
Java:
private class MyTask extends AsyncTask<Params, Progress, Result> { ... }
Params => ist der Klassentyp, den du als Parameter an der #execute-Methode (das Äquivalent zu der #start-Methode eines Threads) übergeben kannst (du kannst mehrere Parameter dieses Typs übergeben). Verarbeitet werden diese dann in der #doInBackground-Methode.
Progress => ist der Klassentyp, den du mittels der #publishProgress-Methode an die #onProgressUpdate-Methode übergibst.
Result => ist der Klassentyp, den ein mögliches Ergebnis haben kann.

Java:
private class MyTask extends AsyncTask<String, Float, Void> { ... }
Würde also bedeuten, dass du einen (oder mehrere Strings) an deinen Task übergibst. Z.B. den Namen einer seriellen Schnittstelle. Integer wäre der Fortschritt in Prozent (0.0 = 0%, 1 = 100%, als Beispiel). Void würde bedeuten, du erwartest keinen speziellen Rückgabewert (in dem Fall musst du in #doInBackground trotzdem ein null zurückgeben). Wenn du für Params auch Void verwendest, ist es nicht mehr notwendig, der #execute-Methode etwas zu übergeben.


Reicht dir das? 😛
 

Zurück
Oben