@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"); }