2012-03-26 10 views
1

Ich habe eine Anwendung, die Video Frame für Frame wiedergibt. Das funktioniert alles. Bei der Suche nach Leistungsproblemen und dem Ausführen von TraceView bemerkte ich jedoch, dass es viele Anrufe zum Versenden von Nachrichten gab, die viel CPU-Zeit verbrauchten.beste Möglichkeit, ui Thread in Android zu aktualisieren

Als ich meine App anschaute, verwende ich einen Handler, um einen Rückruf an die UI zu senden, um die aktuelle Bildnummer anzuzeigen. Wenn ich das entfernte, sind alle DispatchMessage-Aufrufe in TraceView weg.

Also meine Frage ist, was ist der beste Weg, um die UI von einem Worker Thread ohne so viel Overhead zu aktualisieren?

** HINWEIS, dieser Anruf wird etwa 30 Mal pro Sekunde getätigt.

Antwort

0

Die angegebenen Ressourcen sind gut je nach Bedarf angegangen. In meinem Fall war es ein Ergebnis von ein paar kleineren Dingen, die auf dem ui-Thread stattfanden, hauptsächlich einige einfache Transformationen. Ich habe all das in meinen Hintergrund-Thread übertragen, also zeichnete ich eine vortransformierte Bitmap. Dies gab dem Ui-Thread genügend Erleichterung, um meine Probleme zu lösen.

1

Ich bin nicht ganz klar über Ihre Implementierung, aber Sie könnten diese versuchen. Wenn Sie eine Ansicht über Ihren Handler aktualisieren, können Sie diese in der Ansicht selbst verwenden, um sie aus einem anderen Thread zu aktualisieren.

post(): http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

Die andere Sache, die Sie könnten versuchen, die runOnUIThread() in der Aktivitätsklasse verwendet.

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

Hoffe, es hilft.

+0

Dies sind großartige Ressourcen, die durch die verschiedenen Möglichkeiten gehen, den ui Thread zu aktualisieren, ich habe richtig aktualisiert, aber andere Dinge verursachten meine Probleme meine Antwort sehen. – broschb

2
// declaration 
BrightTimer brt; 
Handler mHandler; 
Runnable mUpdateResults; 

// onCreate 
mHandler = new Handler(); 
mUpdateResults = new Runnable() { 
    public void run() { 
     // set value to the widget you wish to update when the thread is running 
    } 
}; 
int delay = 0; // delay for 1 sec. 
int period = 60000; // repeat every 1 sec. 

Timer timer = new Timer(); 

brt = new BrightTimer(); 
timer.scheduleAtFixedRate(brt, delay, period); 

// TimerClass 
public class BrightTimer extends TimerTask 
{ 
    @Override 
    public void run() { 
     mHandler.post(mUpdateResults); 
    } 
} 
+0

Das obige ist, was ich mit dem Handler-Ansatz mache, der einzige Unterschied ist, dass ich keine Updates in einem festen Intervall über den "Timer" -Thread posten werde, ich führe sie nach Bedarf aus. Das obige würde für mich nicht funktionieren, da ich Rahmenaktualisierungen überspringen würde, was nicht wünschenswert wäre. – broschb

Verwandte Themen