2010-08-02 29 views
14

Tengo un servicio que crea una notificación y luego la actualiza con cierta información periódicamente. Después de aproximadamente 12 minutos más o menos el teléfono se cuelga y se reinicia, creo que es causado por una pérdida de memoria en el siguiente código que tiene que ver con la forma en que estoy actualizando la notificación. ¿Podría alguien consultarme y avisarme si este es el caso? estoy haciendo malpérdida de memoria de Android en el servicio de notificación

onCreate:

mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

createNotification:

private void createNotification() { 
    Intent contentIntent = new Intent(this,MainScreen.class); 
    contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent appIntent =PendingIntent.getActivity(this,0, contentIntent, 0); 

    contentView = new RemoteViews(getPackageName(), R.layout.notification); 
    contentView.setImageViewResource(R.id.image, R.drawable.icon); 
    contentView.setTextViewText(R.id.text, ""); 

    notification = new Notification(); 
    notification.when=System.currentTimeMillis(); 
    notification.contentView = contentView; 
    notification.contentIntent = appIntent; 
} 

updateNotification:

private void updateNotification(String text){ 
    contentView.setTextViewText(R.id.text, text); 
    mNotificationManager.notify(0, notification); 
} 

Gracias de antemano.

+0

Por favor, publique algo de Logcat justo antes del reinicio – smith324

+0

Es solo que GC se hace cada vez más grande hasta que causa problemas y comienza a matar cosas y reinicia – stealthcopter

+0

Asegúrese de que sea seguro para su aplicación. Intente desinstalarlo por completo y vea si todavía sucede. Puede ser alguna otra aplicación que instaló recientemente. – Moncader

Respuesta

9

Me encontré con el mismo problema. Parece que si no "almacena en caché" RemoteView y Notification en el servicio, sino que los vuelve a crear desde cero en la rutina de "actualización", este problema desaparece. Sí, sé que no es eficiente, pero al menos el teléfono no se reinicia debido a errores de memoria.

+0

Hmmm raro, intentaré esto después de las vacaciones para confirmarlo. – stealthcopter

+0

Esto parece funcionar, hasta donde sé. – Timmmm

+0

Hola, estoy actualizando la vista remota de una notificación (precisamente 3 textviews dentro de ella) continuamente (después de cada segundo) usando un servicio. El teléfono se vuelve súper lento y se congela después de un tiempo. ¿Debo recrear notificaciones para este problema también? – berserk

2

Tuve el mismo problema. Mi solución es similar a la que dijo @haimg, pero guardo en caché la notificación (solo se recrea la RemoteView). Al hacerlo, la notificación no volverá a parpadear si lo está mirando.

Ejemplo:

public void createNotification(Context context){ 
    Notification.Builder builder = new Notification.Builder(context); 

    // Set notification stuff... 

    // Build the notification 
    notification = builder.build(); 
} 

public void updateNotification(){ 
    notification.bigContentView = getBigContentView(); 
    notification.contentView = getCompactContentView(); 

    mNM.notify(NOTIFICATION_ID, notification); 
} 

Y en los métodos y getBigContentViewgetCompactContentView vuelvo un nuevo RemoteViews con el diseño actualizado.