|
|
|
@ -28,9 +28,7 @@ import java.math.BigDecimal; |
|
|
|
|
import java.net.HttpURLConnection; |
|
|
|
|
import java.net.MalformedURLException; |
|
|
|
|
import java.net.URL; |
|
|
|
|
import java.util.HashSet; |
|
|
|
|
import java.util.Properties; |
|
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Created by lyy on 2017/1/18. |
|
|
|
@ -38,7 +36,7 @@ import java.util.Set; |
|
|
|
|
*/ |
|
|
|
|
final class SingleThreadTask implements Runnable { |
|
|
|
|
private static final String TAG = "SingleThreadTask"; |
|
|
|
|
private DownloadUtil.ConfigEntity mConfigEntity; |
|
|
|
|
private DownloadUtil.ChildThreadConfigEntity mConfigEntity; |
|
|
|
|
private String mConfigFPath; |
|
|
|
|
private long mChildCurrentLocation = 0; |
|
|
|
|
private int mBufSize; |
|
|
|
@ -47,14 +45,14 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
private long mSleepTime = 0; |
|
|
|
|
|
|
|
|
|
SingleThreadTask(DownloadStateConstance constance, IDownloadListener listener, |
|
|
|
|
DownloadUtil.ConfigEntity downloadInfo) { |
|
|
|
|
DownloadUtil.ChildThreadConfigEntity downloadInfo) { |
|
|
|
|
AriaManager manager = AriaManager.getInstance(AriaManager.APP); |
|
|
|
|
CONSTANCE = constance; |
|
|
|
|
CONSTANCE.CONNECT_TIME_OUT = manager.getDownloadConfig().getConnectTimeOut(); |
|
|
|
|
CONSTANCE.READ_TIME_OUT = manager.getDownloadConfig().getIOTimeOut(); |
|
|
|
|
mListener = listener; |
|
|
|
|
this.mConfigEntity = downloadInfo; |
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
mConfigFPath = downloadInfo.CONFIG_FILE_PATH; |
|
|
|
|
} |
|
|
|
|
mBufSize = manager.getDownloadConfig().getBuffSize(); |
|
|
|
@ -76,12 +74,13 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override public void run() { |
|
|
|
|
HttpURLConnection conn; |
|
|
|
|
InputStream is; |
|
|
|
|
HttpURLConnection conn = null; |
|
|
|
|
InputStream is = null; |
|
|
|
|
BufferedRandomAccessFile file = null; |
|
|
|
|
try { |
|
|
|
|
URL url = new URL(mConfigEntity.DOWNLOAD_URL); |
|
|
|
|
conn = ConnectionHelp.handleConnection(url); |
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
Log.d(TAG, "任务【" |
|
|
|
|
+ mConfigEntity.TEMP_FILE.getName() |
|
|
|
|
+ "】线程__" |
|
|
|
@ -102,8 +101,7 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
conn.setReadTimeout(CONSTANCE.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
|
|
|
|
is = conn.getInputStream(); |
|
|
|
|
//创建可设置位置的文件
|
|
|
|
|
BufferedRandomAccessFile file = |
|
|
|
|
new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", mBufSize); |
|
|
|
|
file = new BufferedRandomAccessFile(mConfigEntity.TEMP_FILE, "rwd", mBufSize); |
|
|
|
|
//设置每条线程写入文件的位置
|
|
|
|
|
file.seek(mConfigEntity.START_LOCATION); |
|
|
|
|
byte[] buffer = new byte[mBufSize]; |
|
|
|
@ -121,10 +119,6 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
file.write(buffer, 0, len); |
|
|
|
|
progress(len); |
|
|
|
|
} |
|
|
|
|
file.close(); |
|
|
|
|
//close 为阻塞的,需要使用线程池来处理
|
|
|
|
|
is.close(); |
|
|
|
|
conn.disconnect(); |
|
|
|
|
if (CONSTANCE.isCancel) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
@ -133,7 +127,7 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
//支持断点的处理
|
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
Log.i(TAG, "任务【" |
|
|
|
|
+ mConfigEntity.TEMP_FILE.getName() |
|
|
|
|
+ "】线程__" |
|
|
|
@ -161,6 +155,20 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
failDownload(mChildCurrentLocation, "下载失败【" + mConfigEntity.DOWNLOAD_URL + "】", e); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
failDownload(mChildCurrentLocation, "获取流失败", e); |
|
|
|
|
} finally { |
|
|
|
|
try { |
|
|
|
|
if (file != null) { |
|
|
|
|
file.close(); |
|
|
|
|
} |
|
|
|
|
if (is != null) { |
|
|
|
|
is.close(); |
|
|
|
|
} |
|
|
|
|
if (conn != null) { |
|
|
|
|
conn.disconnect(); |
|
|
|
|
} |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -170,7 +178,7 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
protected void stop() { |
|
|
|
|
synchronized (AriaManager.LOCK) { |
|
|
|
|
try { |
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
CONSTANCE.STOP_NUM++; |
|
|
|
|
Log.d(TAG, "任务【" |
|
|
|
|
+ mConfigEntity.TEMP_FILE.getName() |
|
|
|
@ -211,7 +219,7 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
*/ |
|
|
|
|
protected void cancel() { |
|
|
|
|
synchronized (AriaManager.LOCK) { |
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
CONSTANCE.CANCEL_NUM++; |
|
|
|
|
Log.d(TAG, "任务【" |
|
|
|
|
+ mConfigEntity.TEMP_FILE.getName() |
|
|
|
@ -250,7 +258,7 @@ final class SingleThreadTask implements Runnable { |
|
|
|
|
if (ex != null) { |
|
|
|
|
Log.e(TAG, msg + "\n" + CommonUtil.getPrintException(ex)); |
|
|
|
|
} |
|
|
|
|
if (mConfigEntity.isSupportBreakpoint) { |
|
|
|
|
if (mConfigEntity.IS_SUPPORT_BREAK_POINT) { |
|
|
|
|
writeConfig(false, currentLocation); |
|
|
|
|
if (CONSTANCE.isFail()) { |
|
|
|
|
Log.e(TAG, "任务【" + mConfigEntity.TEMP_FILE.getName() + "】下载失败"); |
|
|
|
|