/** 停止所有任务 */ public void stopAllTask() { // 从下载队列移除 for (Map.Entry<String, DownloadHttpTask> entry : mDownloadingTaskMap.entrySet()) { DownloadHttpTask task = entry.getValue(); task.setInterrupt(true); } mDownloadingTaskMap.clear(); Iterator<DownloadInfo> downloadingIt = mDownloadingTasks.iterator(); while (downloadingIt.hasNext()) { DownloadInfo b = downloadingIt.next(); b.setState(DownloadInfo.PAUSE); downloadingIt.remove(); mPausingTasks.add(b); // 放入暂停队列 } mDownloadingTasks.clear(); // 从等待队列移除 Iterator<DownloadInfo> waitIt = mWaitTasks.iterator(); while (waitIt.hasNext()) { DownloadInfo b = waitIt.next(); b.setState(DownloadInfo.PAUSE); waitIt.remove(); mPausingTasks.add(b); // 放入暂停队列 break; } mWaitTasks.clear(); }
/** * 重新下载 * * @param url */ public void restartTask(String url) { Iterator<DownloadInfo> pauseIt = mPausingTasks.iterator(); if (mPausingTasks.size() > 0) { synchronized (mIteratorLock) { while (pauseIt.hasNext()) { DownloadInfo downloadInfo = pauseIt.next(); if (TextUtils.equals(downloadInfo.getUrl(), url)) { if (mDownloadingTasks.size() < MAX_DOWNLOAD_COUNT) { downloadInfo.setState(DownloadInfo.DOWNLOADING); DownloadHttpTask task = new DownloadHttpTask(downloadInfo, mDownloadUIHandler, mDbHelper, this); mDownloadingTaskMap.put(url, task); mDownloadingTasks.add(downloadInfo); pauseIt.remove(); task.start(); } else { downloadInfo.setState(DownloadInfo.WAIT); mWaitTasks.offer(downloadInfo); pauseIt.remove(); } return; } } } } else { stopTask(url); restartTask(url); } }
/** * 下载一个任务 * * @param url * @param listener */ public void addTask(String url, DownloadListener listener) { if (StringUtils.isEmpty(url)) { Logger.d("download url null"); return; } DownloadInfo downloadInfo = new DownloadInfo(); downloadInfo.setUrl(url); if (!hasTask(url)) { downloadInfo.setTargetFolder(mTargetFolder); try { mDbHelper.save(downloadInfo); } catch (DbException e) { Logger.e(e); } if (mDownloadingTasks.size() < MAX_DOWNLOAD_COUNT) { downloadInfo.setState(DownloadInfo.DOWNLOADING); mDownloadingTasks.add(downloadInfo); DownloadHttpTask task = new DownloadHttpTask(downloadInfo, mDownloadUIHandler, mDbHelper, this); mDownloadingTaskMap.put(url, task); task.start(); } else { // 加入等待队列 downloadInfo.setState(DownloadInfo.WAIT); boolean b = mWaitTasks.offer(downloadInfo); if (b) { addTaskListener(url, listener); } } mAllTasks.add(downloadInfo); } else { Logger.d("任务已存在"); } }
@Override public void nextTask() { synchronized (mNextTaskLockObj) { if (!mNextTaskLock) { mNextTaskLock = true; // TODO mDownloadingTasks 同步状态(临时解决方案) synchronized (mIteratorLock) { Iterator<DownloadInfo> downloadingIt = mDownloadingTasks.iterator(); while (downloadingIt.hasNext()) { DownloadInfo b = downloadingIt.next(); if (b.getState() == DownloadInfo.PAUSE) { mPausingTasks.add(b); try { downloadingIt.remove(); } catch (Exception e) { Logger.e(e); } } else if (b.getState() == DownloadInfo.COMPLETE) { mCompleteTasks.add(b); try { downloadingIt.remove(); } catch (Exception e) { Logger.e(e); } } } } synchronized (mIteratorLock) { Iterator<Map.Entry<String, DownloadHttpTask>> downloadinMapIt = mDownloadingTaskMap.entrySet().iterator(); while (downloadinMapIt.hasNext()) { Map.Entry<String, DownloadHttpTask> entry = downloadinMapIt.next(); DownloadHttpTask task = entry.getValue(); if (task != null && task.isInterrupt()) { try { downloadinMapIt.remove(); } catch (Exception e) { Logger.e(e); } } } } executeNextTask(); mNextTaskLock = false; } } }
private void executeNextTask() { if (mDownloadingTasks.size() < MAX_DOWNLOAD_COUNT) { if (mWaitTasks.size() > 0) { DownloadInfo downloadInfo = mWaitTasks.poll(); if (downloadInfo != null) { String url = downloadInfo.getUrl(); downloadInfo.setState(DownloadInfo.DOWNLOADING); DownloadHttpTask task = new DownloadHttpTask(downloadInfo, mDownloadUIHandler, mDbHelper, this); mDownloadingTaskMap.put(url, task); task.start(); } } } else { Logger.d("已达到最大下载数量:" + mDownloadingTasks.size()); } }
private synchronized void removeDownloadingMap(String url) { synchronized (mIteratorLock) { Iterator<Map.Entry<String, DownloadHttpTask>> it = mDownloadingTaskMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, DownloadHttpTask> entry = it.next(); String key = entry.getKey(); DownloadHttpTask task = entry.getValue(); if (TextUtils.equals(key, url)) { if (task != null) { task.setInterrupt(true); } try { it.remove(); } catch (Exception e) { Logger.e(e); } break; } } } }