В моем приложении я загружаю файлы, используя службу намерений. При запуске загрузки также создается уведомление о ходе загрузки. Все работает нормально, но проблема заключается в том, что уведомление замедляет телефон: Следующий мой код: Примечания: я удалил несвязанную часть коды, чтобы сделать простой и ясный:Уведомление замедляется
public void startDownload(String name, String packageName, String path, boolean obb, boolean data) {
try {
notificationId = generateNoficationId(packageName);
Intent i = new Intent(getApplicationContext(), DownloadListView.class);
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, 0);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle(name)
.setContentText("downloading...")
.setSmallIcon(R.drawable.newiconpurple)
.setContentInfo("0%")
.setProgress(100, 0, true)
.setContentIntent(pi)
.setOngoing(true)
.setAutoCancel(true);
nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notification = mBuilder.build();
startForeground(notificationId, notification);
url = new URL(IPClass.SERVERIP + path + "/" + packageName);
connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setReadTimeout(7000);
long fileLength = connection.getContentLength();
connection.connect();
input = connection.getInputStream();
output = new FileOutputStream("/sdcard/downloadtmp/" + packageName, true);
byte dataSize[] = new byte[16384];
int count;
downloadedSoFar = 0;
continueDownload = true;
while ((count = input.read(dataSize)) > 0 && continueDownload) {
if (!downloadCancelList.contains(packageName)) {
downloadedSoFar = downloadedSoFar + count;
output.write(dataSize, 0, count);
progress = (int) ((downloadedSoFar * 100L)/fileLength);
progressChange(name, progress, packageName, obb, data);
} else {
continueDownload = false;
int startId = downloadIdList.get(packageName);
stopSelf(startId);
nm.cancel(notificationId);
downloadCancelList.remove(packageName);
stopForeground(true);
}
Thread.sleep(250);
}
}
} catch (Exception ex) {
nm.cancel(notificationId);
} finally {
try {
if (output != null) output.close();
if (input != null) input.close();
} catch (IOException ignored) {
}
if (connection != null) {
connection.disconnect();
} else if (resumeConnection != null) {
resumeConnection.disconnect();
}
}
}
И следующим является метод progressChange:
void progressChange(final String name, final int progress, final String packageName, boolean obb, boolean data) {
if (lastupdate != progress) {
lastupdate = progress;
if (progress < 100) {
mBuilder.setProgress(100, Integer.valueOf(progress), false).setContentInfo(progress + "%");
nm.notify(notificationId, mBuilder.build());
} else if (progress == 100) {
stopForeground(true);
mBuilder.setContentText("download finished").setProgress(0, 0, false).setOngoing(false).setContentInfo("");
nm.notify(notificationId, mBuilder.build());
new DownloadController().removeFromDownloadList(packageName);
new DownloadFinished(name, packageName, obb, data).execute();
}
}
}
Пожалуйста, помогите!
Спасибо за ответ, но можете быть более точным – Shoaib
Ну, например, только отправлено уведомление каждый раз, когда прогресс прогрессирует полным 10% – ShibbyUK
Подсчитайте, сколько раз вы обновляете свое уведомление. Уверен, у вас есть ~ 100 обновлений. Таким образом, просмотр, отображаемый в уведомлении, должен быть завышен (не знаю, действительно ли оно раздувается или изменяется напрямую, ставка сначала). Таким образом, изображение, создающее некоторое представление 100 раз, будет действительно ошибочным после 50, я думаю. Чтобы проверить - просто откройте простую деятельность и запустите вращающийся экран, когда посмотрите на профилировщик памяти. Значения будут увеличиваться до GC (если нет утечек). Так что изменить ход реже. Как каждые 10% или что. – Ekalips