/ / Simple TextView.setText causa il 40% di utilizzo della CPU - android, cpu-usage

Simple TextView.setText causa il 40% di utilizzo della CPU - android, cpu-usage

L'esecuzione della mia applicazione causa l'utilizzo della CPU di circa il 40% sul mio telefono:

final String position = String.format("%02d:%02d:%02d", time.getHours(), time.getMinutes(),
time.getSeconds());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
c.mTxtPosition.setText(position);
...

Commentando il setText metodo l'utilizzo della CPU scende al livello previstodi ~ 4%. Il metodo viene richiamato ogni secondo e aggiorna ImageViews, CustomViews ... senza causare lo stesso eccesso di carico. Oltre all'utilizzo della CPU dalvik segnala costantemente la raccolta dei rifiuti di circa 10-1000 oggetti semplicemente chiamando setText ().

Creare un file di traccia come questo:

Debug.startMethodTracing("setText");
c.mTxtPosition.setText(position);
Debug.stopMethodTracing();

traceview elenca i seguenti metodi come Top 5 in base alla rispettiva CPU% esclusiva:

  • ViewParent.invalidateChildInParent (16%)
  • View.requestLayout (11%)
  • ViewGroup.invalidateChild (9%)
  • TextView.setText (7%)
  • toplevel (6%)

Qualcuno ha una spiegazione per questo?

risposte:

18 per risposta № 1

L'ho notato anch'io qualche tempo fa, penso che il problema è che ogni volta che si chiama setText, la dimensione della casella di testo può cambiare, richiedendo quindi l'intero schermo per passare attraverso relayout (costoso).

Non ho ancora provato questo, ma se il tuotextbox è semplice e può essere fatto per essere una dimensione relativamente fissa, magari provare a sottoclasse TextView e creare una vista che non si ridimensiona su setText, ma piuttosto disegna tutto ciò che può all'interno dell'area esistente? Ciò farebbe risparmiare un sacco di tempo.

Forse c'è già una bandiera per impostare il testo che può farglielo fare, ma io non ne sono consapevole, anche se non ho cercato da vicino.


2 per risposta № 2

Nel mio caso, aggiorno un TextView dall'evento touch, che causa un sacco di aggiornamenti. La soluzione era di modificare TextView layout_width e layout_height a dimensione fissa.


1 per risposta № 3

alcuni possibili miglioramenti:

  1. prova ad usare un gestore che aggiorna la visualizzazione del testo ogni 0,5 secondi invece di un thread che lo fa.
  2. rendere il runnable un oggetto costante finale anziché craking uno nuovo ogni secondo.
  3. considera di controllare che l'ora sia cambiata (newTimeInMs-LastPublishedTimeInMs> = 1000) prima di dire al textview di aggiornarsi.
  4. invece di String.format, prova ad usare StringBuilder. tuttavia, non si apprezza la soluzione locale fornita da String.format (ad esempio, per le cifre arabe).

0 per risposta № 4

Nel mio caso era questa proprietà di TextView:

android:ellipsize="marquee"

Rimozione accelerata impostazione del testo.