|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Mi Service consume mucha RAM
Tengo un problema con una app que estoy realizando y no se como puedo solucionarlo, espero que me podáis ayudar, os cuento el caso.
Es una app de un calendario/agenda para el trabajo, ya que tenemos unos turnos un poco complicados de entender y de esta forma nosotros y nuestras familias pueden saber en todo momento de que turno estamos. Mi Service es dependiente de un Alarmmanager que se activa a una hora concreta que el usuario a programado y lo que hace es activar el Service que abre una base de datos Sqlite para comprobar si en ese día hay alguna nota como haría cualquier agenda. Si la hay y coincide con la hora programada se lanza una notificación avisando al usuario de que tiene una notificación para ese día. Este service tiene que estar activado evidentemente siempre y debería comprobar la fecha y la hora una vez al día, a la hora programada, a no ser de que el usuario desactive el servicio de notificaciones. El problema es que este servicio que yo tengo creado consume 65Mb de Ram aproximadamente y android lo saca del sistema con el consiguiente problema de que deja de funcionar el sistema de notificaciones. Como puedo crear el Service o el Alarmmanager o la Notificación o yo que sé que no consuma tantos recursos, porque estoy desesperado. Muchas gracias por adelantado y por supuesto si necesitáis algo más de información o código, solo tenéis que pedirlo. |
|
#2
|
||||
|
||||
En primer lugar, no se porqué tienes un AlarmManager y luego dejas el servicio funcionando continuamente. ¿No es más fácil que si tienes que hacer la comprobación 1 vez al día establezcas un setRepeating en el AlarmManager y el servicio hace la comprobación y después se muere hasta el día siguiente?
Luego, en cuanto a los problemas de RAM, en un principio no deberían ser importantes, de hecho es de las pocas cosas "buenas" que tiene Java. La teoría es que mientras algo sea accesible el recolector no lo quitará, además de que el recolector pasa cuando le sale a él de los cataplines. ¿Cómo evitar que algo sea siempre accesible? No abusando de las variables globales, si algo tiene que ser local mételo dentro de una función, si algo tiene que ser global pero quieres asegurarte que el recolector lo quita, establécelo a null y después llama a System.gc() para asegurarte que el recolector es llamado lo antes posible. Y por último, si quieres que tu servicio se levante él solo si se muere porque el sistema decide eliminarlo, basta con iniciarlo en modo START_STICKY o START_REDELIVER_INTENT, según necesidades. |
![]() |
![]() |
||||||
|