Android – Declarativa vs interfaz de usuario programática

¿Alguien ha visto o compilado puntos de referencia comparando declarativa (XML) versus UI de programa creado en Android?

Hay cosas que Google ha hecho para acelerar el enfoque declarativo, pero todavía tiene el paso de inflación de diseño realizado en tiempo de ejecución.

¿Ha cambiado alguna vez (o considerado) el cambio de su interfaz de usuario de declarativa a programática por cualquier motivo?

Muy poco de la inflación de diseño se realiza en tiempo de ejecución. Como se sugiere en la API de LayoutInflator:

Por razones de rendimiento, la inflación de la vista depende en gran medida del procesamiento previo de archivos XML que se realiza en el momento de la creación. Por lo tanto, actualmente no es posible utilizar LayoutInflater con un XmlPullParser sobre un archivo XML simple en tiempo de ejecución

Si echa un vistazo a la fuente , muchas de las vistas se extraen de un mapa hash basado en su etiqueta XML.

En respuesta a su pregunta de si he comparado el inflado, tengo que decir que no. Personalmente encuentro la idea de comparar el inflador de diseño en Android para que tu aplicación sea el equivalente de comparar el analizador de DOM en Firefox para tu sitio web. No creo que el ejercicio sea inútil, pero usted debe tener una razón mucho mejor que "mi distribución de actividad es demasiado complicada para el inflador" …

Si necesita un diseño generado dinámicamente, sería mejor crearlo de forma programática. Si su visión es simplemente tomar mucho tiempo para inflar, debe simplificar su vista XML.

He desarrollado esta clase para pre-inflar una piscina de puntos de vista y reutilizarlo cada vez que necesito. He ganado segundos en el rendimiento durante la actualización de la interfaz de usuario, que es bastante impresionante.

Mi Logcat dice:

updating UI inflating on demand >> 2136mS updating UI reusing from pool >> 937mS 

Aquí está mi clase, simplemente no me importa mi estilo de codificación Java torpe, soy un programador de C + + incrustado.

 import java.util.ArrayList; import java.util.List; import android.view.LayoutInflater; import android.view.View; public class ViewPool { private List<View> mViews; private LayoutInflater mInf; private int mIdx; private int mResource; /** * Constructor, gives Inflater and resource ID to inflate * @param mInf Layout inflater * @param rID Resource ID of view to inflate * @para number number of views that must inflate on first initialization */ public ViewPool(LayoutInflater mInf, int rID, int number) { super(); int idx; mViews = new ArrayList<View>(); this.mInf = mInf; mResource = rID; mIdx=0; // index of first used item for(idx=0; idx<number;++idx) { mViews.add((View)mInf.inflate(mResource, null)); } } /** * Start from first item of pool */ public void Reset() { mIdx=0; } /** * Get a view from pool, if no more views on pool, inflate more * @return */ public View GetView() { View retval; retval = mViews.get(mIdx); ++mIdx; if(mIdx == mViews.size()) // no more views in pool?? mViews.add((View)mInf.inflate(mResource, null)); // inflate more return(retval); } } 

Hice algunas pruebas muy informales / hacking en esto, y encontró que teniendo el enfoque programático, aunque no es tan agradable trabajar con, afeitado entre un tercio y la mitad del tiempo total tomado. La prueba se ejecutó en un Samsung 7 "Galaxy sólo, y no en un AVD.

Como digo, se trataba de una prueba muy informal / hackish (como verás por el código), con circunstancias muy limitadas, el tipo de cosas que preparas rápidamente para satisfacer tu propia curiosidad y no usualmente para el consumo público.

R.layout.ll y R.layout.tv son archivos de diseño simples que contienen LinearLayouts y TextViews en blanco, respectivamente.

Si sólo estás trabajando con un puñado de puntos de vista, me quedaría con XML / infladores, pero para centenares entonces tal vez querrás considerar el enfoque programático si la velocidad es un problema.

 package com.inflatervscode; import java.util.Calendar; import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class InflaterVSCodeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // Generates a few nested LinearLayouts/TextViews, a number of // times, and works out how many milliseconds this took. @Override public void onResume() { super.onResume(); setContentView(R.layout.main); int num_repeats = 500; // Change this to however many times you want to // create a set of nested views. LinearLayout masterLL = (LinearLayout)findViewById(R.id.test); TextView results = (TextView)findViewById(R.id.results); Calendar c = Calendar.getInstance(); long startTime = c.getTimeInMillis(); for (int i=0;i<num_repeats;i++) { // Replace the section below with LinearLayout fll = new LinearLayout(this); etc LinearLayout fll = (LinearLayout)getLayoutInflater().inflate(R.layout.ll, null); LinearLayout sll = (LinearLayout)getLayoutInflater().inflate(R.layout.ll, null); LinearLayout tll = (LinearLayout)getLayoutInflater().inflate(R.layout.ll, null); TextView tv = (TextView)getLayoutInflater().inflate(R.layout.tv, null); tv.setText(i+""); tll.addView(tv); sll.addView(tll); fll.addView(sll); masterLL.addView(fll); } c = Calendar.getInstance(); long endTime = c.getTimeInMillis(); String tt = Long.toString((endTime-startTime)); results.setText("Results for "+num_tests+" tests:\n\nStart:"+Long.toString(startTime)+"\nEnd :"+Long.toString(endTime)+"\n\nDifference (ms):"+tt); } 

}

  • Swiffy-convertidos Flash a HTML5 animados anuncios de Google AdSense causar un rendimiento terrible jank en Chrome para Android
  • ¿Cómo puedo dividir mi archivo en bloques de datos y trasfer los bloques de mi aplicación android?
  • ¿La pantalla de bienvenida de Android es blanca al principio?
  • Despliegue de dibujo de pantalla de Android Canvas
  • Cómo utilizar Viewport Marker Management en Android
  • Android webview rendimiento, ¿qué me falta?
  • ¿Cómo almacenar en caché y almacenar objetos y establecer una política de expiración en android?
  • ¿Es Hibernate un exceso para una aplicación de Android?
  • Android: Actualiza los datos de fragmento anteriores cuando se pulsa el botón de retroceso
  • Android HTTP Publicar en una URL sin parámetros
  • ¿Por qué mi aplicación de Android empieza muy lento en los dispositivos reales, pero normal en el emulador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.