更新通知时设置ContentView最终会冻结应用程序? (机器人)

时间:2015-05-18 00:57:40

标签: java android mobile service notifications

我有一项服务,每毫秒更新一次通知(秒表)。

最初工作正常,问题是,应用程序最终变慢,秒表更新看起来非常滞后。我已经确定了这个问题,因为我正在重置通知的内容视图。如果我注释掉该代码,计时器将无限期运行。如果我离开该行,计时器和应用程序会在大约1-2分钟后显着减慢。

创建通知的代码:

notificationContent.setImageViewResource(R.id.image, R.drawable.ic_main);
notificationContent.setTextViewText(R.id.exerciseName, _currentExercise.getTitle());
notificationContent.setTextViewText(R.id.setNumber, "Set " + _currentSet + "/" + _currentExercise.getSets());
notificationContent.setTextViewText(R.id.timeElapsed, getFormattedElapsedTime());
notificationContent.setOnClickPendingIntent(R.id.notifButton, setComplete);
mBuilder.setSmallIcon(icon); //for some reason I need this for my view to show up

mBuilder.setContentIntent(contentIntent);
notification = mBuilder.build();
notification.bigContentView = notificationContent;

notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.flags |= Notification.FLAG_NO_CLEAR;

//attach notification and ensure service continues to run in foreground after activity is destroyed
startForeground(NOTIFICATION_ID, notification);

更新通知的代码(每毫秒调用一次):

notificationContent.setTextViewText(R.id.exerciseName, _currentExercise.getTitle());
notificationContent.setTextViewText(R.id.setNumber, getString(R.string.sets_prefix, _currentSet, _currentExercise.getSets()));
notificationContent.setTextViewText(R.id.timeElapsed, getFormattedElapsedTime());

notification = mBuilder.build();
notification.bigContentView = notificationContent;

mNotificationManager.notify(NOTIFICATION_ID,notification);

这一行:notification.bigContentView = notificationContent;创造了减速。如果我删除它,应用程序将无限期地顺利运行。如果我把它留下来,我的应用程序会变慢。加班时间也会变慢。就像它在一分钟后开始减速,并且在5分钟之后,它无法忍受的缓慢和迟缓。我不知道为什么更新通知的视图会导致这种情况。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我似乎每次更新通知时都会通过创建新的远程视图来解决它。

    RemoteViews newNotifContent = new RemoteViews(getPackageName(), R.layout.custom_notification);
    newNotifContent.setTextViewText(R.id.exerciseName, _currentExercise.getTitle());
    newNotifContent.setTextViewText(R.id.setNumber, getString(R.string.sets_prefix, _currentSet, _currentExercise.getSets()));
    newNotifContent.setTextViewText(R.id.timeElapsed, getFormattedElapsedTime());

    Notification notif = mBuilder.build();
    notif.bigContentView = newNotifContent;

    mNotificationManager.notify(NOTIFICATION_ID,notif);

现在没有滞后但我真的不知道为什么每毫秒制作一个新的远程视图对象就可以解决它。如果有人知道,请随时加入

答案 1 :(得分:1)

也许有点晚了,但我想说这对我有帮助。 我的应用程序与内置通知完美配合。我使用一个intentService来更新我的GUI实现一个观察者(类似于秒表)。 但是当我尝试使用一些操作按钮(暂停和恢复)来自定义通知时,我的设备最初运行良好,但随后变得越来越热,直到它无法忍受缓慢且滞后......

但是,如果每次更新通知时都创建新的RemoteView,它就像魅力一样。我也不知道为什么...也许与快速访问局部变量引用相关的东西而不是全局变量?

只是一些提示:我已经扩展了RemoteView以便设置更轻松的点击动作按钮。这个链接解释了前者:

  

https://stackoverflow.com/a/22585875/6641443

我希望它有所帮助。感谢