@Override
  public void run() {
    while (!bIsStop) {
      waitforUrl();

      if (DEBUG) {
        CommonUtilsConfig.LOGD_WITH_TIME("<<<<< [[run]] >>>>>");
      }
      synchronized (mRequestList) {
        if (mRequestList.size() == 0) {
          // bIsRunning = false;
          bIsStop = true;
          break;
        }
      }

      if (DEBUG) {
        CommonUtilsConfig.LOGD_WITH_TIME("<<<<< [[run]]  end synchronized (mRequestList) >>>>>");
      }

      DownloadRequest request = null;
      try {
        request = findRequestCanOperate(mRequestList);
        if (request == null) {
          bIsStop = true;
        }
        if (request != null && request.mStatus != DownloadRequest.STATUS_CANCEL) {
          if (DEBUG) {
            CommonUtilsConfig.LOGD(
                "================ <<" + Thread.currentThread().getName() + ">> working on : ");
            CommonUtilsConfig.LOGD("begin operate one request : " + request.toString());
            CommonUtilsConfig.LOGD("============================================");
          }

          String cacheFile =
              InternetUtils.requestBigResourceWithCache(
                  mContext, request.mDownloadUrl, request.getHeaders());

          if (DEBUG) {
            CommonUtilsConfig.LOGD("----- after get the cache file : " + cacheFile + " =======");
          }
          if (!TextUtils.isEmpty(cacheFile)) {
            // 将文件移动到下载完成的页面
            String filePath = mvFileToDownloadedDir(cacheFile, request.mFileExtension);
            if (!TextUtils.isEmpty(filePath)) {
              // notify success
              // 将文件移动到下载完成的页面
              DownloadResponse response = tryToHandleDownloadFile(filePath, request);
              if (response != null) {
                mSuccessHandler.notifyAll(-1, -1, response);
                handleResponseByListener(DOWNLOAD_SUCCESS, request.mDownloadUrl, response, false);
                removeRequest(request);
                continue;
              } else {
                handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, false);
                mFailedHandler.notifyAll(-1, -1, request);
                continue;
              }
            } else {
              handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, false);
              mFailedHandler.notifyAll(-1, -1, request);
              continue;
            }
          }

          if (request.getmStatus() != DownloadRequest.STATUS_CANCEL) {
            handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, false);
            mFailedHandler.notifyAll(-1, -1, request);
          } else {
            handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, true);
          }

          if (DEBUG) {
            CommonUtilsConfig.LOGD("success end operate one request : " + request);
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
        if (DEBUG) {
          CommonUtilsConfig.LOGD("Exception : ", e);
          CommonUtilsConfig.LOGD("exception end operate one request : " + request);
          CommonUtilsConfig.LOGD(e.getStackTrace().toString());
        }

        if (request.getmStatus() != DownloadRequest.STATUS_CANCEL) {
          handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, false);
          mFailedHandler.notifyAll(-1, -1, request);
        } else {
          handleResponseByListener(DOWNLOAD_FAILED, request.mDownloadUrl, request, true);
        }
      }

      removeRequest(request);
    }

    System.gc();
  }