/**
  * 重新下载
  *
  * @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("任务已存在");
    }
  }
 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());
   }
 }