Example #1
0
  @Override
  public void run() {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
    while (info.redirect < MAX_REDIRECTS) {
      HttpURLConnection conn = null;
      try {
        conn = (HttpURLConnection) new URL(info.realUrl).openConnection();
        conn.setInstanceFollowRedirects(false);
        conn.setConnectTimeout(DEFAULT_TIMEOUT);
        conn.setReadTimeout(DEFAULT_TIMEOUT);

        addRequestHeaders(conn);

        final int code = conn.getResponseCode();
        switch (code) {
          case HTTP_OK:
          case HTTP_PARTIAL:
            dlInit(conn, code);
            return;
          case HTTP_MOVED_PERM:
          case HTTP_MOVED_TEMP:
          case HTTP_SEE_OTHER:
          case HTTP_NOT_MODIFIED:
          case HTTP_TEMP_REDIRECT:
            final String location = conn.getHeaderField("location");
            if (TextUtils.isEmpty(location))
              throw new DLException("Can not obtain real url from location in header.");
            info.realUrl = location;
            info.redirect++;
            continue;
          default:
            if (info.hasListener) info.listener.onError(code, conn.getResponseMessage(), info);
            EventBus.getDefault().post(info, "onError");
            DLManager.getInstance(context).removeDLTask(info.baseUrl);
            info.state = DLState.FAIL;
            try {
              mDLInfoDao.update(info);
            } catch (SQLException e1) {
              e1.printStackTrace();
            }
            return;
        }
      } catch (Exception e) {
        if (info.hasListener) info.listener.onError(ERROR_OPEN_CONNECT, e.toString(), info);
        EventBus.getDefault().post(info, "onError");
        DLManager.getInstance(context).removeDLTask(info.baseUrl);
        info.state = DLState.FAIL;
        try {
          mDLInfoDao.update(info);
        } catch (SQLException e1) {
          e1.printStackTrace();
        }
        return;
      } finally {
        if (null != conn) conn.disconnect();
      }
    }
    throw new RuntimeException("Too many redirects");
  }