Files
assistant-android/app/src/main/java/com/gh/download/DownloadThread.java
2016-10-09 15:18:32 +08:00

168 lines
5.1 KiB
Java

package com.gh.download;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import com.gh.common.util.HttpsUtils;
import com.gh.common.util.Utils;
import org.apache.http.HttpStatus;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownloadThread extends Thread {
private static final int CONNECT_TIME = 5000;
private static final int READ_TIME = 5000;
private DownloadEntity entry;
private DownloadListener listener;
private DownloadStatus status;
private Context context;
public DownloadThread(Context context,
DownloadEntity entry,
DownloadListener listener) {
this.entry = entry;
this.listener = listener;
this.context = context;
}
@Override
public void run() {
super.run();
try {
File targetFile = new File(entry.getPath());
if (!targetFile.exists()) {
File dir = targetFile.getParentFile();
if (dir.exists() || dir.mkdirs()) {
targetFile.createNewFile();
}
}
FileOutputStream fileOutputStream;
if (targetFile.length() > 0) {
fileOutputStream = new FileOutputStream(entry.getPath(), true);
} else {
fileOutputStream = new FileOutputStream(entry.getPath());
}
URL url = new URL(entry.getUrl());
Utils.log("url = " + entry.getUrl());
HttpURLConnection connection;
if ("https".equals(url.getProtocol())) {
connection = HttpsUtils.getHttpsURLConnection(url);
} else {
connection = (HttpURLConnection) url.openConnection();
}
connection.setRequestMethod("GET");
connection.setConnectTimeout(CONNECT_TIME);
connection.setReadTimeout(READ_TIME);
connection.setRequestProperty("RANGE",
"bytes=" + targetFile.length() + "-");
Utils.log(DownloadThread.class.getSimpleName(),
"startPosition-->" + targetFile.length());
//设置自动重定向
connection.setInstanceFollowRedirects(true);
int code = connection.getResponseCode();
Utils.log("code = " +code);
if (code == HttpStatus.SC_MOVED_PERMANENTLY
|| code == HttpStatus.SC_MOVED_TEMPORARILY) {
//未自动重定向
String location = connection.getHeaderField("Location");
Utils.log("location = " + location);
url = new URL(location);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(CONNECT_TIME);
connection.setReadTimeout(READ_TIME);
connection.setRequestProperty("RANGE",
"bytes=" + targetFile.length() + "-");
Utils.log(DownloadThread.class.getSimpleName(),
"startPosition-->" + targetFile.length());
//设置自动重定向
connection.setInstanceFollowRedirects(true);
}
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
long conentLength = connection.getContentLength();
String eTag = connection.getHeaderField("ETag");
if (!TextUtils.isEmpty(eTag) && eTag.startsWith("\"") && eTag.endsWith("\"")) {
eTag = eTag.substring(1, eTag.length() - 1);
}
String eTag2 = entry.getETag();
if (!TextUtils.isEmpty(eTag2) && !eTag2.equals(eTag)) {
//链接被劫持,抛出异常
Utils.log("eTag = " + eTag);
Utils.log("eTag2 = " + eTag2);
listener.onStatusChanged(DownloadStatus.hijack);
Utils.log(DownloadThread.class.getSimpleName(),
"error-->链接被劫持");
interrupt();
} else {
// 第一次下载记录文件长度
if (entry.getSize() == 0) {
entry.setSize(conentLength);
DownloadDao.getInstance(context).newOrUpdate(entry);
Utils.log(DownloadThread.class.getSimpleName(),
"记录第一次长度");
}
Utils.log(DownloadThread.class.getSimpleName(),
"progress:" + entry.getProgress() + "/curfilesize:"
+ targetFile.length() + "=====contentLength:"
+ conentLength + "/ totalSize:" + entry.getSize());
byte[] buffer = new byte[2048];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
listener.onProgressChanged(targetFile.length(), len);
if (status == DownloadStatus.pause
|| status == DownloadStatus.cancel) {
listener.onStatusChanged(status);
break;
}
}
if (status != DownloadStatus.pause
&& status != DownloadStatus.cancel) {
listener.onStatusChanged(DownloadStatus.done);
}
bos.flush();
Utils.log(DownloadThread.class.getSimpleName(),
"flush==>" + targetFile.length() + ",progress==>"
+ entry.getProgress());
bis.close();
bos.close();
}
} catch (Exception e) {
String errorMsg = Log.getStackTraceString(e);
//e.getMessage() will null error
if (!TextUtils.isEmpty(e.getMessage()) && e.getMessage().contains("connection timeout")) {
listener.onStatusChanged(DownloadStatus.timeout, errorMsg);
} else {
listener.onStatusChanged(DownloadStatus.neterror, errorMsg);
}
Utils.log(DownloadThread.class.getSimpleName(),
"exception-->" + e.toString());
}
}
public void setStatus(DownloadStatus status) {
this.status = status;
}
}