代码之家  ›  专栏  ›  技术社区  ›  stealthcopter

android内存泄漏通知服务

  •  14
  • stealthcopter  · 技术社区  · 14 年前

    我有一个服务,它创建一个通知,然后定期更新某些信息。大约12分钟后,手机崩溃并重新启动,我相信这是由于内存泄漏导致的以下代码与我如何更新通知,请有人检查/建议我,如果是这种情况,我做错了什么。

    mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    

    创建通知:

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

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

    提前谢谢。

    2 回复  |  直到 14 年前
        1
  •  9
  •   haimg    14 年前

    我偶然发现了同样的问题。看起来,如果您不在服务中“缓存”远程视图和通知,而是在“更新”例程中从头开始重新创建它们,那么这个问题就会消失。是的,我知道这是效率不高,但至少手机不会重新启动从内存不足的错误。

        2
  •  2
  •   Alesqui    11 年前

    我也有同样的问题。我的解决方案与@haimg所说的很接近,但我确实缓存了通知(只是重新创建了远程视图)。这样,如果您正在查看通知,它就不会再次闪烁。

    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 更新了布局。