Java – use huge memory in notifications
•
Java
I am developing a service application that displays the progress of the timer in the notification area (with progress bar and text) I have extracted a simpler example of the same problem
Service code:
public class TNService extends Service { private notificationmanager nm; private Notification notification; private RemoteViews remoteView; @Override public void onCreate () { nm = (notificationmanager) this.getSystemService(Context.NOTIFICATION_SERVICE); notification = new Notification(android.R.drawable.stat_sys_download,"My notification",System.currentTimeMillis()); remoteView = new RemoteViews(this.getPackageName(),R.layout.notification); remoteView.setImageViewResource(R.id.icon,android.R.drawable.stat_sys_download); remoteView.setTextViewText(R.id.text,""); remoteView.setProgressBar(R.id.progress,100,false); notification.flags = Notification.FLAG_NO_CLEAR; notification.contentView = remoteView; notification.contentIntent = PendingIntent.getActivity(this,new Intent(this,TNActivity.class),PendingIntent.FLAG_UPDATE_CURRENT); Timer timer = new Timer (); timer.schedule(new TNTask(this),200); } @Override public IBinder onBind(Intent arg0) { return null; } public void updateNotification(int progress) { remoteView.setProgressBar(R.id.progress,1000,progress,false); remoteView.setTextViewText(R.id.text,"Progress: " + progress); nm.notify(0,notification); } }
Code of TimerTask:
public class TNTask extends TimerTask { private TNService service; private int progress; public TNTask(TNService s) { this.service = s; this.progress = 0; } @Override public void run() { progress = (progress + 1) % 1000; this.service.updateNotification (progress); } }
The problem is huge memory usage This is the logcat output:
D/dalvikvm(11985): GC_EXPLICIT freed 1258 objects / 84016 bytes in 1157ms D/dalvikvm( 85): GC_FOR_MALLOC freed 52216 objects / 1900968 bytes in 130ms D/dalvikvm( 85): GC_FOR_MALLOC freed 49465 objects / 1805248 bytes in 125ms D/dalvikvm( 85): GC_FOR_MALLOC freed 53106 objects / 1909992 bytes in 134ms D/dalvikvm(12008): GC_EXPLICIT freed 1604 objects / 100944 bytes in 90ms D/dalvikvm( 85): GC_FOR_MALLOC freed 53011 objects / 1937160 bytes in 135ms D/dalvikvm( 85): GC_FOR_MALLOC freed 49806 objects / 1817992 bytes in 143ms D/dalvikvm( 85): GC_FOR_MALLOC freed 49016 objects / 1769536 bytes in 135ms D/dalvikvm( 85): GC_FOR_MALLOC freed 53509 objects / 1941064 bytes in 145ms D/dalvikvm( 85): GC_FOR_MALLOC freed 49895 objects / 1842312 bytes in 146ms D/dalvikvm( 85): GC_FOR_MALLOC freed 48728 objects / 1774496 bytes in 150ms D/dalvikvm( 85): GC_FOR_MALLOC freed 47557 objects / 1701976 bytes in 146ms D/dalvikvm( 85): GC_FOR_MALLOC freed 53540 objects / 1903808 bytes in 156ms D/dalvikvm( 85): GC_FOR_MALLOC freed 48997 objects / 1784048 bytes in 158ms D/dalvikvm( 85): GC_FOR_MALLOC freed 48326 objects / 1776864 bytes in 158ms D/dalvikvm( 85): GC_FOR_MALLOC freed 47566 objects / 1742488 bytes in 169ms D/dalvikvm( 85): GC_FOR_MALLOC freed 47606 objects / 1703416 bytes in 170ms D/dalvikvm( 162): GC_EXPLICIT freed 11238 objects / 641368 bytes in 1064ms
I think this is too much memory. After a period of time, the phone suspends this output:
D/dalvikvm( 85): GC_FOR_MALLOC freed 0 objects / 0 bytes in 241ms I/dalvikvm-heap( 85): Clamp target GC heap from 24.008MB to 24.000MB I/dalvikvm-heap( 85): Grow heap (frag case) to 24.000MB for 52-byte allocation I/dalvikvm-heap( 85): Clamp target GC heap from 26.008MB to 24.000MB D/dalvikvm( 85): GC_FOR_MALLOC freed 0 objects / 0 bytes in 241ms I/dalvikvm-heap( 85): Clamp target GC heap from 24.008MB to 24.000MB I/dalvikvm-heap( 85): Grow heap (frag case) to 24.000MB for 24-byte allocation I/dalvikvm-heap( 85): Clamp target GC heap from 26.008MB to 24.000MB D/dalvikvm( 85): GC_FOR_MALLOC freed 0 objects / 0 bytes in 247ms I/dalvikvm-heap( 85): Clamp target GC heap from 24.009MB to 24.000MB I/dalvikvm-heap( 85): Grow heap (frag case) to 24.000MB for 28-byte allocation I/dalvikvm-heap( 85): Clamp target GC heap from 26.009MB to 24.000MB D/dalvikvm( 85): GC_FOR_MALLOC freed 0 objects / 0 bytes in 247ms I/dalvikvm-heap( 85): Clamp target GC heap from 24.009MB to 24.000MB
Does anyone know how to use so many memories?
thank you!
Solution
I stumbled upon the same problem... It seems that if I don't cache remoteview and notification in the service, but recreate them in the "update" routine, the problem disappears Yes, I know it's not very efficient, but due to lack of memory, the phone won't restart until at least 10-15 minutes later
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码