утечка памяти Android в службе уведомлений - PullRequest
14 голосов
/ 02 августа 2010

У меня есть служба, которая создает уведомление, а затем периодически обновляет его определенной информацией. Приблизительно после 12 минут или около того телефон ломается и перезагружается, я полагаю, что это вызвано утечкой памяти в следующем коде, связанной с тем, как я обновляю уведомление, может кто-нибудь проверить или сообщить мне, если это так, и что я я делаю не так.

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);
}

Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 19 декабря 2010

Я наткнулся на ту же проблему.Похоже, что если вы не «кэшируете» RemoteView и Notification в службе, а воссоздаете их с нуля в процедуре «update», эта проблема исчезает.Да, я знаю, что это неэффективно, но по крайней мере телефон не перезагружается из-за ошибок нехватки памяти.

2 голосов
/ 09 мая 2013

У меня была та же проблема.Мое решение близко к тому, которое сказал @haimg, но я кеширую уведомление (только RemoteView воссоздается).При этом уведомление не будет мигать снова, если вы посмотрите на него.

Пример:

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);
}

А в методах getBigContentView и getCompactContentView я возвращаю новыйRemoteViews с обновленным макетом.

...