| Index: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| index 038878378b11d742ae6a8edbc926da83e9443c7f..f7291c92a0f82af2b64cb2d22ecf89b93d53d40a 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| @@ -46,8 +46,8 @@ import java.util.HashMap;
|
| import java.util.HashSet;
|
| import java.util.Iterator;
|
| import java.util.List;
|
| -import java.util.Map;
|
| import java.util.Set;
|
| +import java.util.concurrent.RejectedExecutionException;
|
| import java.util.concurrent.TimeUnit;
|
|
|
| /**
|
| @@ -644,29 +644,26 @@ public class DownloadManagerService extends BroadcastReceiver implements
|
| if (mIsUIUpdateScheduled) return;
|
|
|
| mIsUIUpdateScheduled = true;
|
| - final List<DownloadProgress> progressToUpdate = new ArrayList<DownloadProgress>();
|
| - Iterator<Map.Entry<String, DownloadProgress>> iter =
|
| - mDownloadProgressMap.entrySet().iterator();
|
| + final List<DownloadProgress> progressPendingUpdate = new ArrayList<DownloadProgress>();
|
| + Iterator<DownloadProgress> iter = mDownloadProgressMap.values().iterator();
|
| while (iter.hasNext()) {
|
| - Map.Entry<String, DownloadProgress> entry = iter.next();
|
| - DownloadProgress progress = entry.getValue();
|
| + DownloadProgress progress = iter.next();
|
| if (progress.mIsUpdated) {
|
| - progressToUpdate.add(new DownloadProgress(progress));
|
| - progress.mIsUpdated = false;
|
| - }
|
| - // Remove progress entry from mDownloadProgressMap if they are no longer needed.
|
| - if ((progress.mDownloadStatus != DOWNLOAD_STATUS_IN_PROGRESS
|
| - || progress.mDownloadItem.getDownloadInfo().isPaused())
|
| - && (progress.mDownloadStatus != DOWNLOAD_STATUS_INTERRUPTED
|
| - || !progress.mIsAutoResumable)) {
|
| - iter.remove();
|
| + progressPendingUpdate.add(progress);
|
| }
|
| }
|
| - if (progressToUpdate.isEmpty()) {
|
| + if (progressPendingUpdate.isEmpty()) {
|
| mIsUIUpdateScheduled = false;
|
| return;
|
| }
|
| - new AsyncTask<Void, Void, List<DownloadItem>>() {
|
| + // Make a copy of the |progressUpdated|, so that we can update the notification on another
|
| + // thread without worrying about concurrent modifications.
|
| + final List<DownloadProgress> progressToUpdate = new ArrayList<DownloadProgress>();
|
| + for (int i = 0; i < progressPendingUpdate.size(); ++i) {
|
| + progressToUpdate.add(new DownloadProgress(progressPendingUpdate.get(i)));
|
| + }
|
| + AsyncTask<Void, Void, List<DownloadItem>> task =
|
| + new AsyncTask<Void, Void, List<DownloadItem>>() {
|
| @Override
|
| public List<DownloadItem> doInBackground(Void... params) {
|
| return updateAllNotifications(progressToUpdate);
|
| @@ -680,7 +677,25 @@ public class DownloadManagerService extends BroadcastReceiver implements
|
| DownloadManager.ERROR_UNKNOWN);
|
| }
|
| }
|
| - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
| + };
|
| + try {
|
| + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
| + for (int i = 0; i < progressPendingUpdate.size(); ++i) {
|
| + DownloadProgress progress = progressPendingUpdate.get(i);
|
| + progress.mIsUpdated = false;
|
| + // Remove progress entry from mDownloadProgressMap if they are no longer needed.
|
| + if ((progress.mDownloadStatus != DOWNLOAD_STATUS_IN_PROGRESS
|
| + || progress.mDownloadItem.getDownloadInfo().isPaused())
|
| + && (progress.mDownloadStatus != DOWNLOAD_STATUS_INTERRUPTED
|
| + || !progress.mIsAutoResumable)) {
|
| + mDownloadProgressMap.remove(progress.mDownloadItem.getId());
|
| + }
|
| + }
|
| + } catch (RejectedExecutionException e) {
|
| + // Reaching thread limit, update will be reschduled for the next run.
|
| + Log.e(TAG, "reaching thread limit, reschedule notification update later.");
|
| + }
|
| +
|
| Runnable scheduleNextUpdateTask = new Runnable(){
|
| @Override
|
| public void run() {
|
|
|