Zeit mit einem Handler messen - Läuft langsam?

E

Extremefall

Ambitioniertes Mitglied
3
Hallo,
ich habe eine komplexe Klasse, in der ich auch einen onClickListener habe. Bei Ausführung wird ein sehr langer Code ausgeführt, der natürlich auch mehrere ms dauert. Nun habe ich einen Zeitmesser in einem Handler. Es wird also alle x ms das TextView Element mit der Zeit aktualisiert. Das klappt auch perfekt.

Nun wird aber der Button gedrückt und der Code ausgeführt. Dadurch verzögert sich leider der erneute Aufruf des Handlers. Wie kann man dieses Problem eventuell umgehen? Der sonstige Code ist in keinem seperaten Thread.
 
Wenn man etwas Längeres in einem onTouchHandler vorhat, sollte man das in einen eigenen Thread auslagern. Nicht zuletzt, weil der onTouch im UI Thread ausgeführt wird.

Deine Formulierung ist etwas unklar, es klingt so, als würdest du das zwar wissen, aber nicht tun (wollen) :D
 
Ich habe momentan etwas, was so aufgebaut ist:
Code:
button.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
        	 Hbuttonclicked.removeCallbacks(buttonclicked);

         	Hbuttonclicked.postDelayed(buttonclicked, 1);
Ich weiß leider nicht genau, wie ich den onClickListener in einen separaten Thread auslagern kann. Könnt ihr mir dabei helfen? Muss ich den ganzen Listener oder nur den Inhalt auslagern und wenn ja, wie geht es überhaupt?
 
Den Callback selber kann man nicht auslagern, aber die teure Aktion, die du in dem Listener anwirfst. Ich weiss allerdings nicht, was Hbuttonclicked für ein Objekt sein soll. Die API kommt mir unbekannt vor.

Ich würde in dem Listener irgendwie einen AsyncTask starten...
 
HButtonclicked ist ein Handler. Wie nutze ich Async Task im Listener?
 
Ich bekomme es irgendwie nicht hin. Mein letzter Ansatz wäre folgendes:
Code:
public void onClick(View v) {
	Thread t = new Thread(){
	          public void run(){
		  // Long time consuming operation
			runOnUiThread(new Runnable() {
					 
                                 @Override
			         public void run() {
                                          rechtsKlick();	
			         }
			});
		  }
       };
 t.start();
 }});
In der Methode rechtsKlick() werden sehr viele Abfragen überprüft und anschließend ein UI Update ausgeführt. Leider hängt es immer noch. Könnt ihr mir vielleicht ein simples Codebeispiel zur Lösung zeigen?
 
Das "sehr viele Abfragen überprüfen" muss dann natürlich mit in die "// Long time consuming Operation" mit rein :D

PS: ich bin immer wieder erstaunt, wie viele Wege es gibt, Sachen in den UI thread zu kriegen (AsyncTask,Handler,runInUIThread(),....)
 
Irgendwie weiß ich noch nicht, was ich alles auslagern muss.
Mein Pseudocode:
Code:
Methode rechtsKlick wird im OnClickListener aufgerufen
public void rechtsKlick(){
a = b;
e = 3;
c = true;
...
geheRechts();
}
// Es gibt If Abfragen für small, medium, large, xlarge
public void geheRechts(){
if (bildschirm == small){
bewegeBildUmXnachRechtsMittelsMargin();
pruefeAktion(); // das ist der lange Code
}
...
}
// Es gibt in der Methode über 250 If Abfragen
public void pruefeAktion(){
if (e == a && ... && ... &&){
c = false;
a= k;
...
updateUIElement();
}
if (...){

}
}
Der Counter wurde vorher in einem Handler gestartet und alle 100 ms wird der Handler aufgerufen und dann gleichzeitig auch die UI upgedatet. Leider besteht das Problem, dass der UI Thread durch den oben aufgeführten Pseudocode blockiert wird. Wie kann man das Problem am einfachsten lösen? Kann man eventuell zwei UI Threads nebeneinander laufen lassen und wenn ja, wie? Vielen Dank für die Antworten.
 
Ich stelle mir das so vor:

du machst aus dem updateUIElement() ein uiElementneedsUpdate = true; und wenn der thread mit dem pruefe (der im AsyncTask im doInBackground wäre) fertig ist und uiElementNeedsUpdate = true dann wird ein uiUpdate per Handler bzw. im AsyncTask im onPostExecute ausfgeführt.
 

Ähnliche Themen

S
  • skywalker22
Antworten
1
Aufrufe
154
swa00
swa00
S
Antworten
17
Aufrufe
530
jogimuc
J
S
Antworten
8
Aufrufe
481
swa00
swa00
Zurück
Oben Unten