2017-01-23 5 views
0

В моем приложении я загружаю файлы, используя службу намерений. При запуске загрузки также создается уведомление о ходе загрузки. Все работает нормально, но проблема заключается в том, что уведомление замедляет телефон: Следующий мой код: Примечания: я удалил несвязанную часть коды, чтобы сделать простой и ясный:Уведомление замедляется

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

Пожалуйста, помогите!

ответ

0

Это очень плохая идея отправить уведомление столько раз. Каждое уведомление необходимо накачивать, хранить и отображать. Надутые уведомления не удаляются из памяти мгновенно при удалении с экрана. Вы просто создаете огромный стек видов, который занимает ОЗУ.

+0

Спасибо за ответ, но можете быть более точным – Shoaib

+0

Ну, например, только отправлено уведомление каждый раз, когда прогресс прогрессирует полным 10% – ShibbyUK

+0

Подсчитайте, сколько раз вы обновляете свое уведомление. Уверен, у вас есть ~ 100 обновлений. Таким образом, просмотр, отображаемый в уведомлении, должен быть завышен (не знаю, действительно ли оно раздувается или изменяется напрямую, ставка сначала). Таким образом, изображение, создающее некоторое представление 100 раз, будет действительно ошибочным после 50, я думаю. Чтобы проверить - просто откройте простую деятельность и запустите вращающийся экран, когда посмотрите на профилировщик памяти. Значения будут увеличиваться до GC (если нет утечек). Так что изменить ход реже. Как каждые 10% или что. – Ekalips

Смежные вопросы