2010-08-02 4 views
14

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

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

Спасибо заранее.

+0

Пожалуйста, разместите часть Logcat прямо перед перезагрузкой. – smith324

+0

Это просто GC становится все больше и больше, пока он не вызывает проблем и не начинает убивать вещи и перезагружается. – stealthcopter

+0

Убедитесь, что это точно ваше приложение. Попробуйте полностью удалить его и посмотреть, все ли это происходит. Возможно, какое-то другое приложение вы установили недавно. – Moncader

ответ

9

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

+0

Хм, странно, я попробую это после праздников, чтобы подтвердить. – stealthcopter

+0

Кажется, это работает, насколько я могу судить. – Timmmm

+0

Привет, Я обновляю Remote View (точно 3 текстовых поля внутри) непрерывно (каждую секунду) с помощью службы. Телефон становится очень медленным и замерзает через некоторое время. Должен ли я воссоздать уведомление по этой проблеме? – berserk

2

У меня была такая же проблема. Мое решение близко к тому, которое сказал @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 с обновленным макетом.

Смежные вопросы