Intereting Posts
Камера в Android Есть ли какая-либо информационная база данных, в которой перечислены все мобильные устройства и спецификации? Отсутствие или неправильное изображение и фон случайным образом на протяжении всего жизненного цикла приложения Google Maps CameraUpdateFactory не инициализирован Выпуск на реальном устройстве с использованием векторного изображения в android. SVG-андроид Удалить элемент из «Частных библиотек Android», который отсутствует в папке с папками моего проекта Ошибка: сборник Android в eclipse Как понять, что показывает LeakCanary? Ограничить доступ для загрузки приложения в Google Play Последний Harka показывается перед первым персонажем в арабском языке Reshaper на Android Как изменить цвет текста кнопки? Разрешения Android M: onRequestPermissionsResult () не вызывается Я не помню свой пароль для debug.keystore для Android. Кнопка Click Listeners в Android Android ==> ListView останется выбранным?

Как предотвратить задержку пользовательского интерфейса при обновлении уведомления при загрузке файла?

В настоящее время я использую AsyncTask для загрузки большого файла в фоновом режиме в моем приложении, в настоящее время процесс загрузки показан как ProgressDialog который обновляется через onProgressUpdate как onProgressUpdate ниже:

 protected String doInBackground(String... sUrl) { try { String destName = sUrl[1]; file_Delete(destName); // Just to make sure! URL url = new URL(sUrl[0]); URLConnection connection = url.openConnection(); connection.connect(); int fileLength = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(destName); byte data[] = new byte[1024]; long total = 0; int count; while ((count = input.read(data)) != -1) { total += count; publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { Log.e(TAG, NAME + ": Error downloading file! " + e.getMessage()); return e.getMessage(); } return null; } @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); DownloadImage.mProgressDialog.setProgress(progress[0]); } 

Это прекрасно работает, однако теперь я хочу использовать уведомление в панели уведомлений, чтобы отслеживать загрузку вместо этого (поскольку файл может быть довольно большим, и пользователи хотели бы отслеживать его вне приложения).

Я пробовал использовать код ниже, однако пользовательский интерфейс начинает сильно publishProgress , я вижу его из-за того, что publishProgress называется alot, поэтому как я могу изменить код фона для вызова publishProgress только каждую секунду

 @Override protected void onProgressUpdate(Integer... progress) { super.onProgressUpdate(progress); DownloadImage.mProgressDialog.setProgress(progress[0]); DownloadImage.myNotification = new NotificationCompat.Builder(c) .setContentTitle("Downloading SlapOS") .setContentText("Download is " + progress[0] + "% done") .setTicker("Downloading...") .setOngoing(true) .setWhen(System.currentTimeMillis()) .setProgress(100, progress[0], false) .setSmallIcon(R.drawable.icon) .build(); DownloadImage.notificationManager.notify(1, DownloadImage.myNotification); } 

Solutions Collecting From Web of "Как предотвратить задержку пользовательского интерфейса при обновлении уведомления при загрузке файла?"

Так как я мог пойти об изменении фонового кода, чтобы вызывать publishProgress только каждую секунду

Я сделал это раньше для функции загрузки, которая показывала% в Notification , но такую ​​же точную идею. Попросите AsyncTask отслеживать, что такое percentDone загрузка, и ТОЛЬКО вызывайте publishProgress когда изменяется значение percentDone . Таким образом, вы только когда-либо будете называть publishProgress когда% загружаемых изменений, и поэтому Notification необходимо обновить. Это должно привести к задержке пользовательского интерфейса.

Я писал это как свою предложенную реализацию, похоже, что OP уже работает. Но, возможно, это поможет кому-то еще в будущем:

  byte data[] = new byte[1024]; long total = 0; int count, latestPercentDone; int percentDone = -1; while ((count = input.read(data)) != -1) { total += count; latestPercentDone = (int) Math.round(total / fileLength * 100.0); if (percentDone != latestPercentDone) { percentDone = latestPercentDone; publishProgress(percentDone); } output.write(data, 0, count); } 

Мне очень понравился ваш подход к нему! Я обнаружил, что изменение кода на следующее улучшило корректность моего обновления. У меня были некоторые проблемы при использовании math.round ().

 latestPercentDone = (int) ((dataBytesWritten / (float) totalSize) * 100); if (percentDone != latestPercentDone) { percentDone = latestPercentDone; publishProgress(percentDone); }