qué - mejor aplicacion para ahorrar bateria android 2018
Android que entiende los tamaños de pila (2)
Cuando establece el presupuesto de la máquina virtual en su emulador / dispositivo, lo que está haciendo es decirle al montón el tamaño máximo permitido. En tiempo de ejecución, el montón crece dinámicamente a medida que Dalvik VM solicita memoria del sistema al sistema operativo. La máquina virtual de Dalvik generalmente comienza asignando un montón relativamente pequeño. Luego, después de cada ejecución del GC, verifica la cantidad de memoria de almacenamiento disponible. Si la proporción de pila libre a pila total es demasiado pequeña, la máquina virtual de Dalvik agregará más memoria a la pila (hasta el tamaño máximo de pila configurado).
Dicho esto, la razón por la que no ve "24 mb" en su pantalla DDMS es porque el montón no ha crecido a su tamaño máximo. Esto permite a Android hacer un buen uso de la ya pequeña cantidad de memoria disponible en dispositivos portátiles.
En cuanto a por qué su aplicación se bloquea en el emulador y no en su teléfono, parece extraño (¿está seguro de que los números son correctos?). Sin embargo, debe tener en cuenta que la memoria se administra de forma dinámica y que la utilización total de la memoria se determina en función de una serie de factores externos (la velocidad / frecuencia a la que se realiza la recolección de basura, etc.).
Finalmente, por las razones que mencioné anteriormente, sería difícil decir con certeza qué tan bien su aplicación administra la memoria en base a la línea de información que proporcionó anteriormente. Realmente deberíamos ver algunos de sus códigos. OutOfMemoryError
embargo, definitivamente vale la pena preocuparse por OutOfMemoryError
, por lo que definitivamente me gustaría examinar el uso de memoria de la aplicación. Una cosa que podría considerar es muestrear sus imágenes de mapa de bits en tiempo de ejecución con llamadas a inSampleSize
usando la clase BitmapFactory
. Esto puede ayudar a reducir la cantidad de memoria requerida para cargar sus mapas de bits dibujables. O eso, o podría reducir la resolución de sus elementos dibujables (aunque 20 kb cada uno me parece bien).
Soy bastante nuevo en el desarrollo de Android y parece que no puedo captar la excepción Java Out of Memory. Sé que significa que mi aplicación ha superado el presupuesto de la máquina virtual, pero después de Google muchas veces, parece que todavía no entiendo este concepto. Me temo que mi aplicación utiliza demasiada memoria porque tengo seis selectores de botones por pantalla con dos mapas de bits para cada selector, que tienen alrededor de 20 kb cada uno de acuerdo con la pestaña de propiedades. En mi G2x arraigado, he establecido el presupuesto de la máquina virtual en 12 MB, reinicié mi teléfono y ejecuté mi aplicación sin ningún problema. Estoy desenlazando los elementos dibujables de cada uno en Destruir () e insinuando al GC que se ejecute aquí también. Después de usar la aplicación durante un tiempo en el emulador, hago clic en "Causa GC" en mi pantalla DDMS y los resultados son ID = 1, Tamaño del montón 6.133 MB, 2.895 MB asignados, 3.238 MB gratis,% Usado 47.20, # Objetos 52.623.
Aquí es donde no entiendo lo que está pasando, mi emulador está configurado a 24 MB de VM. ¿Dónde está ese número? El problema real que tengo es que si configuro el emulador en 16 MB de VM, mi aplicación se bloquea en la segunda actividad con la excepción Fuera de memoria. ¿Por qué no se bloquea en mi teléfono con la VM configurada a 12 MB o en mi antiguo teléfono HTC Magic con 12 MB de stock de VM? También, ¿piensan que mi aplicación está tomando demasiada memoria? No tengo idea de si esos números DDMS son buenos o no. Gracias por tu tiempo.
En cuanto a mi código, tengo todas las imágenes especificadas en diseños XML, no hago nada programático con ellas, excepto para agregarles escuchas. Encontré este fragmento de código aquí y lo he agregado a cada actividad que tengo ...
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
De lo contrario, todo lo que hago es agregar onClickListeners a los botones que tienen fondos PNG. Me gustaría aprender a especificar los fondos de los botones programáticamente, pero necesito tener las funciones del selector como enfocar, presionar, no enfocado pero presionado, etc. para hacer que los fondos de los botones cambien de acuerdo con la interacción del usuario. He revisado los documentos sobre esto, pero parece abrumador, por eso me di cuenta de que comenzaría aquí con los conceptos básicos de administración de Heaps y trabajaría para especificar selectores en el código. Esto puede no tener sentido, pero ¿hay una cantidad "saludable" de asignación de memoria que una aplicación pueda asignar sin acercarse a la excepción de memoria insuficiente? Por ejemplo, si una aplicación asignó 6 MB, debería estar bien, pero 8 MB la estarían presionando, ¿existen límites similares en la asignación de memoria? Gracias nuevamente Alex Lockwood por su respuesta. Voy a leerlo y releerlo hasta que esto tenga sentido para mí.
Incluso si su aplicación no alcanza el límite de pila de "24 mb" (varía dentro de los dispositivos), es posible que aún se bloquee porque Android tarda un tiempo en aumentar el espacio de pila para su aplicación.
En mi situación, estaba creando y volcando varias imágenes en poco tiempo.
Muy a menudo me OutOfMemoryError
.
Parece que Android no fue lo suficientemente rápido para hacer crecer el espacio de almacenamiento para mi aplicación.
Creo que resolví este problema usando la configuración largeHeap
en el archivo Manifest. Con esa configuración activada, Android deja más memoria libre cada vez que crece el montón, minimizando la posibilidad de alcanzar el límite actual.
No utilizo el límite de 24 mb, pero esta gran largeHeap
era bastante útil.
Solo necesita configurar largeHeap="true"
en la etiqueta de aplicación de su AndroidManifest.xml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme" >
Aún así, asegúrese de tener cuidado al tratar con imágenes, como aconsejó @Alex Lockwood.