我正在開發一個應用程序與服務,顯示在通知區域(與進度條和文本)計時器的進度。我在下面解釋了一個相同問題的簡單例子。巨大的內存使用通知
服務的代碼:
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, 0, false);
notification.flags = Notification.FLAG_NO_CLEAR;
notification.contentView = remoteView;
notification.contentIntent = PendingIntent.getActivity(this, 0, new Intent(this,
TNActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
Timer timer = new Timer();
timer.schedule(new TNTask(this), 0, 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);
}
}
一個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);
}
}
的問題是巨大的內存使用情況。這裏是logcat的輸出:
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
我認爲這是太多的內存,並經過一段時間的電話掛起這個輸出:
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
任何人都知道我怎麼能做到這一點,而無需使用這麼多的內存?
謝謝!
參見受試者的開放缺陷:http://code.google.com/p/android/issues/detail?id=13941 – 2012-08-09 08:11:14