Objeto de interfaz de usuario creado a través de XML no se está barajando en Android Marshmallow
Estoy trabajando en portar android marshmallow para algunos hardware. El problema que enfrento es, si creo un objeto de interfaz de usuario a través de xml, no está siendo sweeped por GC. Por ejemplo:
He creado una aplicación para comprobar esto. Esta aplicación tiene 2 actividades. Cada actividad tiene un botón. Si presiono este botón, termina la actividad actual e inicia otra actividad.
- Mostrar imágenes desde la carpeta Desplegable con Universal Image Loader
- Tipos incompatibles, requeridos java.lang.Integer , encontrado Int ?
- Se requiere la autenticación de Google con un servidor de back-end
- Android: ¿Está onPause () garantizado para ser llamado después de finish ()?
- ActivityCompat.requestPermissions que no muestran el cuadro de diálogo
Si defino un botón en la disposición del xml y en la actividad setcontentview, creará un objeto del botón del tipo. Ahora estoy conmutando estas actividades una y otra vez para crear objetos múltiples del botón, puesto que no estoy utilizando cualquier LAUNCH_MODE (intencionalmente).
Ahora vamos a decir que 8 objetos de Button han sido creados. Volví a pulsar el botón varias veces y llegó a la pantalla de inicio. Inicie GC desde Android Studio. Después de que si tomo Heap Dump, todavía encuentro 8 instancias de Button pero "ids de objetos se cambian". Por otra parte, vi que el constructor de la clase Button no se llamaba después de iniciar GC.
Entonces, ¿quién creó estos objetos? Y si estos son los mismos objetos, por qué se ha cambiado ids.
Lo mismo si lo hago creando un objeto Button usando la clase Button java,
Como Botón b = nuevo Botón (Contexto c);
Los objetos están siendo barridos.
Ponga por favor un poco de luz si usted entiende el problema.
BR, Rahul
- La anotación sólo está disponible para java 1.5 y superior cuando se genera Google App Engine Backend (JDK 1.8, nuevo ADT instalado)
- Android no escribirá nueva línea en el archivo de texto
- ThreadPoolExecutor: Obtiene un Runnable específico que se está ejecutando
- Práctica recomendada para que el cliente android se comunique con un servidor mediante subprocesos
- Android, onReceive en BroadCastReceiver se llama varias veces
- Cómo deshabilitar / activar jackson SerializationFeature.WRAP_ROOT_VALUE?
- Privilegios elevados en la aplicación para Android
- Función para traducir las coordenadas finales de una línea
No ha proporcionado ningún ejemplo de código para lo que está hablando. Sólo puedo adivinar que en realidad está creando estos objetos Button como mencionó,
Button b = new Button(this);
Si estás haciendo referencia a un widget de botón en XML, entonces no deberías estar creando ningún objeto Button, solo deberías instanciar el objeto.
Botón creado en XML
<Button android:id="@+id/btn_action" android:layout_width="wrap_content" android:layout_height="wrap_content" />
Instanciar el botón en el código
Button btnAction = (Button) findViewById(R.id.btn_action);
Este objeto de botón no debe tener varias referencias de id. Cuando asigna un identificador a este widget en XML, el ID de referencia se agrega inmediatamente a su archivo R.java. Compruebe su archivo de R.java usted verá algo como
public static final int btn_action=0x7f0d033b;
Este es un valor final, no se puede cambiar. Así que cada vez que hace referencia al objeto, btnAction, está haciendo referencia a 0x7f0d033b. La destrucción de tu actividad destruirá este objeto a menos que estés haciendo algo extraño como crear objetos estáticos.
También tenga en cuenta que no hay garantía de que GC se llamará inmediatamente después de una actividad se destruye. Se llama sobre todo cuando es necesario. Si desea ayudar a "obligar" GC a ser llamado cuando una actividad es destruida, entonces limpiar en onDestroy () de la actividad. ¡Aclamaciones!
@Override protected void onDestroy() { // invoke garbage collector System.gc(); }
También tenga en cuenta que llamar a System.gc () no significa necesariamente que se llamará Garbage Collector. La definición para esto es
Indica a la VM que sería un buen momento para ejecutar el recolector de basura. Tenga en cuenta que esto es sólo una pista. No hay ninguna garantía de que el recolector de basura se ejecutará realmente.
No hay necesidad de un nuevo botón, el botón ya está definido en el manifiesto, sólo con findViewById para buscarlo.
- ¿Cómo puedo definir una anotación Android personalizada (por ejemplo, @Background)
- Android youtube API reproduce dos o más jugadores de Youtube en una actividad principal