修复组件出现的几个问题

pull/617/head
laoyuyu 5 years ago
parent 2a92321785
commit 75ff995d81
  1. 7
      Aria/src/main/java/com/arialyy/aria/core/download/CheckDEntityUtil.java
  2. 3
      Aria/src/main/java/com/arialyy/aria/core/download/CheckDGEntityUtil.java
  3. 6
      Aria/src/main/java/com/arialyy/aria/core/download/m3u8/M3U8Delegate.java
  4. 2
      Aria/src/main/java/com/arialyy/aria/core/download/m3u8/M3U8LiveDelegate.java
  5. 2
      Aria/src/main/java/com/arialyy/aria/core/download/target/HttpBuilderTarget.java
  6. 14
      FtpComponent/src/main/java/com/arialyy/aria/ftp/download/FtpDThreadTaskAdapter.java
  7. 6
      FtpComponent/src/main/java/com/arialyy/aria/ftp/upload/FtpUThreadTaskAdapter.java
  8. 6
      HttpComponent/src/main/java/com/arialyy/aria/http/download/DGroupLoaderUtil.java
  9. 14
      HttpComponent/src/main/java/com/arialyy/aria/http/download/HttpDThreadTaskAdapter.java
  10. 2
      HttpComponent/src/main/java/com/arialyy/aria/http/upload/HttpUThreadTaskAdapter.java
  11. 3
      M3U8Component/src/main/java/com/arialyy/aria/m3u8/M3U8Listener.java
  12. 6
      M3U8Component/src/main/java/com/arialyy/aria/m3u8/M3U8TaskOption.java
  13. 22
      M3U8Component/src/main/java/com/arialyy/aria/m3u8/M3U8ThreadTaskAdapter.java
  14. 25
      M3U8Component/src/main/java/com/arialyy/aria/m3u8/live/M3U8LiveUtil.java
  15. 32
      M3U8Component/src/main/java/com/arialyy/aria/m3u8/vod/M3U8VodUtil.java
  16. 3
      PublicComponent/src/main/java/com/arialyy/aria/core/common/RecordHandler.java
  17. 10
      PublicComponent/src/main/java/com/arialyy/aria/core/group/AbsGroupUtil.java
  18. 7
      PublicComponent/src/main/java/com/arialyy/aria/core/listener/DownloadGroupListener.java
  19. 10
      PublicComponent/src/main/java/com/arialyy/aria/core/task/AbsThreadTaskAdapter.java
  20. 40
      PublicComponent/src/main/java/com/arialyy/aria/core/task/ThreadTask.java
  21. 13
      PublicComponent/src/main/java/com/arialyy/aria/util/ComponentUtil.java
  22. 1
      app/build.gradle
  23. 18
      app/src/main/java/com/arialyy/simple/core/download/m3u8/M3U8VodDLoadActivity.java
  24. 1
      app/src/main/res/layout/activity_m3u8_vod.xml
  25. 1
      app/src/main/res/layout/fragment_video_player.xml

@ -64,7 +64,8 @@ public class CheckDEntityUtil implements ICheckEntityUtil {
private void handleM3U8() { private void handleM3U8() {
File file = new File(mWrapper.getTempFilePath()); File file = new File(mWrapper.getTempFilePath());
int bandWidth = (int) mWrapper.getM3U8Params().getParam(IOptionConstant.bandWidth); Object bw = mWrapper.getM3U8Params().getParam(IOptionConstant.bandWidth);
int bandWidth = bw == null ? 0 : (int) bw;
// 缓存文件夹格式:问文件夹/.文件名_码率 // 缓存文件夹格式:问文件夹/.文件名_码率
String cacheDir = String.format("%s/.%s_%s", file.getParent(), file.getName(), bandWidth); String cacheDir = String.format("%s/.%s_%s", file.getParent(), file.getName(), bandWidth);
@ -153,8 +154,8 @@ public class CheckDEntityUtil implements ICheckEntityUtil {
mEntity.setFileName(newFile.getName()); mEntity.setFileName(newFile.getName());
// 如过使用Content-Disposition中的文件名,将不会执行重命名工作 // 如过使用Content-Disposition中的文件名,将不会执行重命名工作
if ((boolean) mWrapper.getOptionParams().getParam(IOptionConstant.useServerFileName) Object usf = mWrapper.getOptionParams().getParam(IOptionConstant.useServerFileName);
|| mWrapper.getRequestType() == ITaskWrapper.M3U8_LIVE) { if ((usf != null && (boolean) usf) || mWrapper.getRequestType() == ITaskWrapper.M3U8_LIVE) {
return true; return true;
} }
if (!TextUtils.isEmpty(mEntity.getFilePath())) { if (!TextUtils.isEmpty(mEntity.getFilePath())) {

@ -134,8 +134,7 @@ public class CheckDGEntityUtil implements ICheckEntityUtil {
return false; return false;
} }
if (mWrapper.getOptionParams().getParam(IOptionConstant.requestEnum) if (mWrapper.getOptionParams().getParam(IOptionConstant.requestEnum) == RequestEnum.POST) {
== RequestEnum.POST) {
for (DTaskWrapper subWrapper : mWrapper.getSubTaskWrapper()) { for (DTaskWrapper subWrapper : mWrapper.getSubTaskWrapper()) {
subWrapper.getOptionParams().setParams(IOptionConstant.requestEnum, RequestEnum.POST); subWrapper.getOptionParams().setParams(IOptionConstant.requestEnum, RequestEnum.POST);
} }

@ -67,7 +67,7 @@ public class M3U8Delegate<TARGET extends AbsTarget> extends BaseDelegate<TARGET>
*/ */
@CheckResult(suggest = Suggest.TO_CONTROLLER) @CheckResult(suggest = Suggest.TO_CONTROLLER)
public M3U8Delegate<TARGET> setMergeHandler(ITsMergeHandler handler) { public M3U8Delegate<TARGET> setMergeHandler(ITsMergeHandler handler) {
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.mergeHandler, handler); mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.mergeHandler, handler);
return this; return this;
} }
@ -79,7 +79,7 @@ public class M3U8Delegate<TARGET extends AbsTarget> extends BaseDelegate<TARGET>
*/ */
@CheckResult(suggest = Suggest.TO_CONTROLLER) @CheckResult(suggest = Suggest.TO_CONTROLLER)
public M3U8Delegate<TARGET> setTsUrlConvert(IVodTsUrlConverter converter) { public M3U8Delegate<TARGET> setTsUrlConvert(IVodTsUrlConverter converter) {
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.vodUrlConverter, converter); mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.vodUrlConverter, converter);
return this; return this;
} }
@ -102,7 +102,7 @@ public class M3U8Delegate<TARGET extends AbsTarget> extends BaseDelegate<TARGET>
*/ */
@CheckResult(suggest = Suggest.TO_CONTROLLER) @CheckResult(suggest = Suggest.TO_CONTROLLER)
public M3U8Delegate<TARGET> setBandWidthUrlConverter(IBandWidthUrlConverter converter) { public M3U8Delegate<TARGET> setBandWidthUrlConverter(IBandWidthUrlConverter converter) {
mTaskWrapper.getM3U8Params().setParams(IOptionConstant.bandWidthUrlConverter, converter); mTaskWrapper.getM3U8Params().setObjs(IOptionConstant.bandWidthUrlConverter, converter);
return this; return this;
} }

@ -44,7 +44,7 @@ public class M3U8LiveDelegate<TARGET extends AbsTarget> extends BaseDelegate<TAR
@CheckResult(suggest = Suggest.TO_CONTROLLER) @CheckResult(suggest = Suggest.TO_CONTROLLER)
public M3U8LiveDelegate<TARGET> setLiveTsUrlConvert(ILiveTsUrlConverter converter) { public M3U8LiveDelegate<TARGET> setLiveTsUrlConvert(ILiveTsUrlConverter converter) {
((DTaskWrapper) getTaskWrapper()).getM3U8Params() ((DTaskWrapper) getTaskWrapper()).getM3U8Params()
.setParams(IOptionConstant.liveTsUrlConverter, converter); .setObjs(IOptionConstant.liveTsUrlConverter, converter);
return this; return this;
} }

@ -96,7 +96,7 @@ public class HttpBuilderTarget extends AbsBuilderTarget<HttpBuilderTarget> {
throw new IllegalArgumentException("adapter为空"); throw new IllegalArgumentException("adapter为空");
} }
getTaskWrapper().getOptionParams().setParams(IOptionConstant.fileLenAdapter, adapter); getTaskWrapper().getOptionParams().setObjs(IOptionConstant.fileLenAdapter, adapter);
return this; return this;
} }
} }

@ -83,16 +83,16 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
return; return;
} }
if (getConfig().isOpenDynamicFile) { if (getThreadConfig().isOpenDynamicFile) {
readDynamicFile(is); readDynamicFile(is);
} else { } else {
readNormal(is); readNormal(is);
handleComplete(); handleComplete();
} }
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, String.format("下载失败【%s】", getConfig().url), e), true); fail(new AriaIOException(TAG, String.format("下载失败【%s】", getThreadConfig().url), e), true);
} catch (Exception e) { } catch (Exception e) {
fail(new AriaIOException(TAG, String.format("下载失败【%s】", getConfig().url), e), false); fail(new AriaIOException(TAG, String.format("下载失败【%s】", getThreadConfig().url), e), false);
} finally { } finally {
try { try {
if (is != null) { if (is != null) {
@ -127,7 +127,7 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
ReadableByteChannel fic = null; ReadableByteChannel fic = null;
try { try {
int len; int len;
fos = new FileOutputStream(getConfig().tempFile, true); fos = new FileOutputStream(getThreadConfig().tempFile, true);
foc = fos.getChannel(); foc = fos.getChannel();
fic = Channels.newChannel(is); fic = Channels.newChannel(is);
ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize()); ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize());
@ -154,7 +154,7 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
} }
handleComplete(); handleComplete();
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, String.format("下载失败【%s】", getConfig().url), e), true); fail(new AriaIOException(TAG, String.format("下载失败【%s】", getThreadConfig().url), e), true);
} finally { } finally {
try { try {
if (fos != null) { if (fos != null) {
@ -179,7 +179,7 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
BufferedRandomAccessFile file = null; BufferedRandomAccessFile file = null;
try { try {
file = file =
new BufferedRandomAccessFile(getConfig().tempFile, "rwd", getTaskConfig().getBuffSize()); new BufferedRandomAccessFile(getThreadConfig().tempFile, "rwd", getTaskConfig().getBuffSize());
file.seek(getThreadRecord().startLocation); file.seek(getThreadRecord().startLocation);
byte[] buffer = new byte[getTaskConfig().getBuffSize()]; byte[] buffer = new byte[getTaskConfig().getBuffSize()];
int len; int len;
@ -201,7 +201,7 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
} }
} }
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, String.format("下载失败【%s】", getConfig().url), e), true); fail(new AriaIOException(TAG, String.format("下载失败【%s】", getThreadConfig().url), e), true);
} finally { } finally {
try { try {
if (file != null) { if (file != null) {

@ -66,9 +66,9 @@ class FtpUThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
} }
file = file =
new BufferedRandomAccessFile(getConfig().tempFile, "rwd", getTaskConfig().getBuffSize()); new BufferedRandomAccessFile(getThreadConfig().tempFile, "rwd", getTaskConfig().getBuffSize());
if (getThreadRecord().startLocation != 0) { if (getThreadRecord().startLocation != 0) {
//file.skipBytes((int) getConfig().START_LOCATION); //file.skipBytes((int) getThreadConfig().START_LOCATION);
file.seek(getThreadRecord().startLocation); file.seek(getThreadRecord().startLocation);
} }
boolean complete = upload(client, file); boolean complete = upload(client, file);
@ -81,7 +81,7 @@ class FtpUThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, fail(new AriaIOException(TAG,
String.format("上传失败,filePath: %s, uploadUrl: %s", getEntity().getFilePath(), String.format("上传失败,filePath: %s, uploadUrl: %s", getEntity().getFilePath(),
getConfig().url)), true); getThreadConfig().url)), true);
} catch (Exception e) { } catch (Exception e) {
fail(new AriaIOException(TAG, null, e), false); fail(new AriaIOException(TAG, null, e), false);
} finally { } finally {

@ -22,6 +22,8 @@ import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.download.DownloadEntity; import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.OnFileInfoCallback; import com.arialyy.aria.core.inf.OnFileInfoCallback;
import com.arialyy.aria.core.listener.IEventListener;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.exception.AriaIOException; import com.arialyy.aria.exception.AriaIOException;
import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.exception.BaseException;
import com.arialyy.aria.core.group.AbsGroupUtil; import com.arialyy.aria.core.group.AbsGroupUtil;
@ -46,8 +48,8 @@ public class DGroupLoaderUtil extends AbsGroupUtil {
private boolean getLenComplete = false; private boolean getLenComplete = false;
private List<DTaskWrapper> mTempWrapper = new ArrayList<>(); private List<DTaskWrapper> mTempWrapper = new ArrayList<>();
public DGroupLoaderUtil(IDGroupListener listener, DGTaskWrapper taskWrapper) { public DGroupLoaderUtil(AbsTaskWrapper taskWrapper, IEventListener listener) {
super(listener, taskWrapper); super(taskWrapper, listener);
taskWrapper.generateTaskOption(HttpTaskOption.class); taskWrapper.generateTaskOption(HttpTaskOption.class);
} }

@ -61,7 +61,7 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
BufferedInputStream is = null; BufferedInputStream is = null;
BufferedRandomAccessFile file = null; BufferedRandomAccessFile file = null;
try { try {
URL url = ConnectionHelp.handleUrl(getConfig().url, mTaskOption); URL url = ConnectionHelp.handleUrl(getThreadConfig().url, mTaskOption);
conn = ConnectionHelp.handleConnection(url, mTaskOption); conn = ConnectionHelp.handleConnection(url, mTaskOption);
if (mTaskWrapper.isSupportBP()) { if (mTaskWrapper.isSupportBP()) {
ALog.d(TAG, ALog.d(TAG,
@ -103,12 +103,12 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn)); is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn));
if (mTaskOption.isChunked()) { if (mTaskOption.isChunked()) {
readChunked(is); readChunked(is);
} else if (getConfig().isOpenDynamicFile) { } else if (getThreadConfig().isOpenDynamicFile) {
readDynamicFile(is); readDynamicFile(is);
} else { } else {
//创建可设置位置的文件 //创建可设置位置的文件
file = file =
new BufferedRandomAccessFile(getConfig().tempFile, "rwd", new BufferedRandomAccessFile(getThreadConfig().tempFile, "rwd",
getTaskConfig().getBuffSize()); getTaskConfig().getBuffSize());
//设置每条线程写入文件的位置 //设置每条线程写入文件的位置
file.seek(getThreadRecord().startLocation); file.seek(getThreadRecord().startLocation);
@ -150,7 +150,7 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
private void readChunked(InputStream is) { private void readChunked(InputStream is) {
FileOutputStream fos = null; FileOutputStream fos = null;
try { try {
fos = new FileOutputStream(getConfig().tempFile, true); fos = new FileOutputStream(getThreadConfig().tempFile, true);
byte[] buffer = new byte[getTaskConfig().getBuffSize()]; byte[] buffer = new byte[getTaskConfig().getBuffSize()];
int len; int len;
while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) { while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) {
@ -167,7 +167,7 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, fail(new AriaIOException(TAG,
String.format("文件下载失败,savePath: %s, url: %s", getEntity().getFilePath(), String.format("文件下载失败,savePath: %s, url: %s", getEntity().getFilePath(),
getConfig().url)), true); getThreadConfig().url)), true);
} finally { } finally {
if (fos != null) { if (fos != null) {
try { try {
@ -188,7 +188,7 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
ReadableByteChannel fic = null; ReadableByteChannel fic = null;
try { try {
int len; int len;
fos = new FileOutputStream(getConfig().tempFile, true); fos = new FileOutputStream(getThreadConfig().tempFile, true);
foc = fos.getChannel(); foc = fos.getChannel();
fic = Channels.newChannel(is); fic = Channels.newChannel(is);
ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize()); ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize());
@ -219,7 +219,7 @@ final class HttpDThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, fail(new AriaIOException(TAG,
String.format("文件下载失败,savePath: %s, url: %s", getEntity().getFilePath(), String.format("文件下载失败,savePath: %s, url: %s", getEntity().getFilePath(),
getConfig().url), e), true); getThreadConfig().url), e), true);
} finally { } finally {
try { try {
if (fos != null) { if (fos != null) {

@ -62,7 +62,7 @@ final class HttpUThreadTaskAdapter extends BaseHttpThreadTaskAdapter {
} }
URL url; URL url;
try { try {
url = new URL(CommonUtil.convertUrl(getConfig().url)); url = new URL(CommonUtil.convertUrl(getThreadConfig().url));
mHttpConn = (HttpURLConnection) url.openConnection(); mHttpConn = (HttpURLConnection) url.openConnection();
mHttpConn.setRequestMethod(mTaskOption.getRequestEnum().name); mHttpConn.setRequestMethod(mTaskOption.getRequestEnum().name);

@ -24,7 +24,6 @@ import com.arialyy.aria.core.listener.BaseDListener;
import com.arialyy.aria.core.listener.IDLoadListener; import com.arialyy.aria.core.listener.IDLoadListener;
import com.arialyy.aria.core.listener.ISchedulers; import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.core.task.AbsTask; import com.arialyy.aria.core.task.AbsTask;
import com.arialyy.aria.core.task.DownloadTask;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
/** /**
@ -32,7 +31,7 @@ import com.arialyy.aria.util.CommonUtil;
*/ */
public class M3U8Listener extends BaseDListener implements IDLoadListener { public class M3U8Listener extends BaseDListener implements IDLoadListener {
M3U8Listener(AbsTask<DTaskWrapper> task, Handler outHandler) { public M3U8Listener(AbsTask<DTaskWrapper> task, Handler outHandler) {
super(task, outHandler); super(task, outHandler);
} }

@ -15,10 +15,10 @@
*/ */
package com.arialyy.aria.m3u8; package com.arialyy.aria.m3u8;
import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.inf.ITaskOption; import com.arialyy.aria.core.inf.ITaskOption;
import com.arialyy.aria.core.processor.ITsMergeHandler; import com.arialyy.aria.core.processor.IBandWidthUrlConverter;
import com.arialyy.aria.core.processor.ILiveTsUrlConverter; import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
import com.arialyy.aria.core.processor.ITsMergeHandler;
import com.arialyy.aria.core.processor.IVodTsUrlConverter; import com.arialyy.aria.core.processor.IVodTsUrlConverter;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.List; import java.util.List;
@ -101,7 +101,7 @@ public class M3U8TaskOption implements ITaskOption {
/** /**
* 生成索引占位字段 * 生成索引占位字段
*/ */
private boolean generateIndexFileTemp; private boolean generateIndexFileTemp = false;
public boolean isGenerateIndexFileTemp() { public boolean isGenerateIndexFileTemp() {
return generateIndexFileTemp; return generateIndexFileTemp;

@ -60,7 +60,7 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
HttpURLConnection conn = null; HttpURLConnection conn = null;
BufferedInputStream is = null; BufferedInputStream is = null;
try { try {
URL url = ConnectionHelp.handleUrl(getConfig().url, mHttpTaskOption); URL url = ConnectionHelp.handleUrl(getThreadConfig().url, mHttpTaskOption);
conn = ConnectionHelp.handleConnection(url, mHttpTaskOption); conn = ConnectionHelp.handleConnection(url, mHttpTaskOption);
ALog.d(TAG, String.format("分片【%s】开始下载", getThreadRecord().threadId)); ALog.d(TAG, String.format("分片【%s】开始下载", getThreadRecord().threadId));
ConnectionHelp.setConnectParam(mHttpTaskOption, conn); ConnectionHelp.setConnectParam(mHttpTaskOption, conn);
@ -92,21 +92,21 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn)); is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn));
if (mHttpTaskOption.isChunked()) { if (mHttpTaskOption.isChunked()) {
readChunked(is); readChunked(is);
} else if (getConfig().isOpenDynamicFile) { } else if (getThreadConfig().isOpenDynamicFile) {
readDynamicFile(is); readDynamicFile(is);
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
fail(new TaskException(TAG, fail(new TaskException(TAG,
String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId, String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId,
getConfig().tempFile.getPath(), getEntity().getUrl()), e), false); getThreadConfig().tempFile.getPath(), getEntity().getUrl()), e), false);
} catch (IOException e) { } catch (IOException e) {
fail(new TaskException(TAG, fail(new TaskException(TAG,
String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId, String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId,
getConfig().tempFile.getPath(), getEntity().getUrl()), e), true); getThreadConfig().tempFile.getPath(), getEntity().getUrl()), e), true);
} catch (Exception e) { } catch (Exception e) {
fail(new TaskException(TAG, fail(new TaskException(TAG,
String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId, String.format("分片【%s】下载失败,filePath: %s, url: %s", getThreadRecord().threadId,
getConfig().tempFile.getPath(), getEntity().getUrl()), e), false); getThreadConfig().tempFile.getPath(), getEntity().getUrl()), e), false);
} finally { } finally {
try { try {
if (is != null) { if (is != null) {
@ -127,7 +127,7 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
private void readChunked(InputStream is) { private void readChunked(InputStream is) {
FileOutputStream fos = null; FileOutputStream fos = null;
try { try {
fos = new FileOutputStream(getConfig().tempFile, true); fos = new FileOutputStream(getThreadConfig().tempFile, true);
byte[] buffer = new byte[getTaskConfig().getBuffSize()]; byte[] buffer = new byte[getTaskConfig().getBuffSize()];
int len; int len;
while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) { while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) {
@ -143,8 +143,8 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
handleComplete(); handleComplete();
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, fail(new AriaIOException(TAG,
String.format("文件下载失败,savePath: %s, url: %s", getConfig().tempFile.getPath(), String.format("文件下载失败,savePath: %s, url: %s", getThreadConfig().tempFile.getPath(),
getConfig().url), e), true); getThreadConfig().url), e), true);
} finally { } finally {
if (fos != null) { if (fos != null) {
try { try {
@ -165,7 +165,7 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
ReadableByteChannel fic = null; ReadableByteChannel fic = null;
try { try {
int len; int len;
fos = new FileOutputStream(getConfig().tempFile, true); fos = new FileOutputStream(getThreadConfig().tempFile, true);
foc = fos.getChannel(); foc = fos.getChannel();
fic = Channels.newChannel(is); fic = Channels.newChannel(is);
ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize()); ByteBuffer bf = ByteBuffer.allocate(getTaskConfig().getBuffSize());
@ -186,8 +186,8 @@ public class M3U8ThreadTaskAdapter extends AbsThreadTaskAdapter {
handleComplete(); handleComplete();
} catch (IOException e) { } catch (IOException e) {
fail(new AriaIOException(TAG, fail(new AriaIOException(TAG,
String.format("文件下载失败,savePath: %s, url: %s", getConfig().tempFile.getPath(), String.format("文件下载失败,savePath: %s, url: %s", getThreadConfig().tempFile.getPath(),
getConfig().url), e), true); getThreadConfig().url), e), true);
} finally { } finally {
try { try {
if (fos != null) { if (fos != null) {

@ -19,13 +19,15 @@ import android.text.TextUtils;
import com.arialyy.aria.core.common.AbsEntity; import com.arialyy.aria.core.common.AbsEntity;
import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.CompleteInfo;
import com.arialyy.aria.core.download.DTaskWrapper; import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
import com.arialyy.aria.core.inf.OnFileInfoCallback; import com.arialyy.aria.core.inf.OnFileInfoCallback;
import com.arialyy.aria.core.listener.IEventListener;
import com.arialyy.aria.core.loader.AbsLoader; import com.arialyy.aria.core.loader.AbsLoader;
import com.arialyy.aria.core.loader.AbsNormalLoaderUtil; import com.arialyy.aria.core.loader.AbsNormalLoaderUtil;
import com.arialyy.aria.core.processor.ILiveTsUrlConverter;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.exception.BaseException;
import com.arialyy.aria.exception.M3U8Exception; import com.arialyy.aria.exception.M3U8Exception;
import com.arialyy.aria.http.HttpTaskOption;
import com.arialyy.aria.m3u8.M3U8InfoThread; import com.arialyy.aria.m3u8.M3U8InfoThread;
import com.arialyy.aria.m3u8.M3U8Listener; import com.arialyy.aria.m3u8.M3U8Listener;
import com.arialyy.aria.m3u8.M3U8TaskOption; import com.arialyy.aria.m3u8.M3U8TaskOption;
@ -54,23 +56,28 @@ public class M3U8LiveUtil extends AbsNormalLoaderUtil {
private List<String> mPeerUrls = new ArrayList<>(); private List<String> mPeerUrls = new ArrayList<>();
private M3U8TaskOption mM3U8Option; private M3U8TaskOption mM3U8Option;
protected M3U8LiveUtil(DTaskWrapper wrapper, M3U8Listener listener) { public M3U8LiveUtil(AbsTaskWrapper wrapper, IEventListener listener) {
super(wrapper, listener); super(wrapper, listener);
wrapper.generateM3u8Option(M3U8TaskOption.class); }
mM3U8Option = (M3U8TaskOption) wrapper.getM3u8Option();
@Override public DTaskWrapper getTaskWrapper() {
return (DTaskWrapper) super.getTaskWrapper();
} }
@Override protected AbsLoader createLoader() { @Override protected AbsLoader createLoader() {
return new M3U8LiveLoader((M3U8Listener) getListener(), (DTaskWrapper) getTaskWrapper()); getTaskWrapper().generateM3u8Option(M3U8TaskOption.class);
getTaskWrapper().generateTaskOption(HttpTaskOption.class);
mM3U8Option = (M3U8TaskOption) getTaskWrapper().getM3u8Option();
return new M3U8LiveLoader((M3U8Listener) getListener(), getTaskWrapper());
} }
@Override protected Runnable createInfoThread() { @Override protected Runnable createInfoThread() {
return null; return null;
} }
private Runnable createLiveInfoThread(){ private Runnable createLiveInfoThread() {
M3U8InfoThread infoThread = M3U8InfoThread infoThread =
new M3U8InfoThread((DTaskWrapper) getTaskWrapper(), new OnFileInfoCallback() { new M3U8InfoThread(getTaskWrapper(), new OnFileInfoCallback() {
@Override public void onComplete(String key, CompleteInfo info) { @Override public void onComplete(String key, CompleteInfo info) {
ALog.d(TAG, "更新直播的m3u8文件"); ALog.d(TAG, "更新直播的m3u8文件");
} }
@ -88,7 +95,7 @@ public class M3U8LiveUtil extends AbsNormalLoaderUtil {
ILiveTsUrlConverter converter = mM3U8Option.getLiveTsUrlConverter(); ILiveTsUrlConverter converter = mM3U8Option.getLiveTsUrlConverter();
if (converter != null) { if (converter != null) {
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) { if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
url = converter.convert(((DownloadEntity) getTaskWrapper().getEntity()).getUrl(), url); url = converter.convert(getTaskWrapper().getEntity().getUrl(), url);
} else { } else {
url = converter.convert(mM3U8Option.getBandWidthUrl(), url); url = converter.convert(mM3U8Option.getBandWidthUrl(), url);
} }

@ -19,13 +19,15 @@ import android.text.TextUtils;
import com.arialyy.aria.core.common.AbsEntity; import com.arialyy.aria.core.common.AbsEntity;
import com.arialyy.aria.core.common.CompleteInfo; import com.arialyy.aria.core.common.CompleteInfo;
import com.arialyy.aria.core.download.DTaskWrapper; import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.processor.IVodTsUrlConverter;
import com.arialyy.aria.core.inf.OnFileInfoCallback; import com.arialyy.aria.core.inf.OnFileInfoCallback;
import com.arialyy.aria.core.listener.IEventListener;
import com.arialyy.aria.core.loader.AbsLoader; import com.arialyy.aria.core.loader.AbsLoader;
import com.arialyy.aria.core.loader.AbsNormalLoaderUtil; import com.arialyy.aria.core.loader.AbsNormalLoaderUtil;
import com.arialyy.aria.core.processor.IVodTsUrlConverter;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.exception.BaseException;
import com.arialyy.aria.exception.M3U8Exception; import com.arialyy.aria.exception.M3U8Exception;
import com.arialyy.aria.http.HttpTaskOption;
import com.arialyy.aria.m3u8.M3U8InfoThread; import com.arialyy.aria.m3u8.M3U8InfoThread;
import com.arialyy.aria.m3u8.M3U8Listener; import com.arialyy.aria.m3u8.M3U8Listener;
import com.arialyy.aria.m3u8.M3U8TaskOption; import com.arialyy.aria.m3u8.M3U8TaskOption;
@ -43,28 +45,32 @@ import java.util.List;
*/ */
public class M3U8VodUtil extends AbsNormalLoaderUtil { public class M3U8VodUtil extends AbsNormalLoaderUtil {
private M3U8Listener mListener;
private List<String> mUrls = new ArrayList<>(); private List<String> mUrls = new ArrayList<>();
private M3U8TaskOption mM3U8Option; private M3U8TaskOption mM3U8Option;
public M3U8VodUtil(DTaskWrapper wrapper, M3U8Listener listener) { public M3U8VodUtil(AbsTaskWrapper wrapper, IEventListener listener) {
super(wrapper, listener); super(wrapper, listener);
wrapper.generateM3u8Option(M3U8TaskOption.class); }
mListener = listener;
mM3U8Option = (M3U8TaskOption) wrapper.getM3u8Option(); @Override public DTaskWrapper getTaskWrapper() {
return (DTaskWrapper) super.getTaskWrapper();
} }
@Override protected AbsLoader createLoader() { @Override protected AbsLoader createLoader() {
return new M3U8VodLoader((M3U8Listener) getListener(), (DTaskWrapper) getTaskWrapper()); getTaskWrapper().generateM3u8Option(M3U8TaskOption.class);
getTaskWrapper().generateTaskOption(HttpTaskOption.class);
mM3U8Option = (M3U8TaskOption) getTaskWrapper().getM3u8Option();
return new M3U8VodLoader((M3U8Listener) getListener(), getTaskWrapper());
} }
@Override protected Runnable createInfoThread() { @Override protected Runnable createInfoThread() {
return new M3U8InfoThread((DTaskWrapper) getTaskWrapper(), new OnFileInfoCallback() { return new M3U8InfoThread(getTaskWrapper(), new OnFileInfoCallback() {
@Override public void onComplete(String key, CompleteInfo info) { @Override public void onComplete(String key, CompleteInfo info) {
IVodTsUrlConverter converter = mM3U8Option.getVodUrlConverter(); IVodTsUrlConverter converter = mM3U8Option.getVodUrlConverter();
if (converter != null) { if (converter != null) {
if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) { if (TextUtils.isEmpty(mM3U8Option.getBandWidthUrl())) {
mUrls.addAll(converter.convert(getEntity().getUrl(), (List<String>) info.obj)); mUrls.addAll(
converter.convert(getTaskWrapper().getEntity().getUrl(), (List<String>) info.obj));
} else { } else {
mUrls.addAll( mUrls.addAll(
converter.convert(mM3U8Option.getBandWidthUrl(), (List<String>) info.obj)); converter.convert(mM3U8Option.getBandWidthUrl(), (List<String>) info.obj));
@ -81,7 +87,7 @@ public class M3U8VodUtil extends AbsNormalLoaderUtil {
} }
mM3U8Option.setUrls(mUrls); mM3U8Option.setUrls(mUrls);
if (isStop()) { if (isStop()) {
getListener().onStop(getEntity().getCurrentProgress()); getListener().onStop(getTaskWrapper().getEntity().getCurrentProgress());
} else if (isCancel()) { } else if (isCancel()) {
getListener().onCancel(); getListener().onCancel();
} else { } else {
@ -94,8 +100,4 @@ public class M3U8VodUtil extends AbsNormalLoaderUtil {
} }
}); });
} }
private DownloadEntity getEntity() {
return (DownloadEntity) getTaskWrapper().getEntity();
}
} }

@ -78,8 +78,11 @@ public class RecordHandler implements IRecordHandler {
if (!file.exists()) { if (!file.exists()) {
ALog.w(TAG, String.format("文件【%s】不存在,重新分配线程区间", mTaskRecord.filePath)); ALog.w(TAG, String.format("文件【%s】不存在,重新分配线程区间", mTaskRecord.filePath));
DbEntity.deleteData(ThreadRecord.class, "taskKey=?", mTaskRecord.filePath); DbEntity.deleteData(ThreadRecord.class, "taskKey=?", mTaskRecord.filePath);
mTaskRecord.threadRecords.clear();
mTaskRecord.threadNum = mAdapter.initTaskThreadNum();
initRecord(false); initRecord(false);
} else if (mTaskRecord.threadRecords == null || mTaskRecord.threadRecords.isEmpty()) { } else if (mTaskRecord.threadRecords == null || mTaskRecord.threadRecords.isEmpty()) {
mTaskRecord.threadNum = mAdapter.initTaskThreadNum();
initRecord(false); initRecord(false);
} }
mAdapter.handlerTaskRecord(mTaskRecord); mAdapter.handlerTaskRecord(mTaskRecord);

@ -23,6 +23,8 @@ import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.IUtil; import com.arialyy.aria.core.inf.IUtil;
import com.arialyy.aria.core.listener.IDGroupListener; import com.arialyy.aria.core.listener.IDGroupListener;
import com.arialyy.aria.core.listener.IEventListener;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.CommonUtil; import com.arialyy.aria.util.CommonUtil;
import java.util.Map; import java.util.Map;
@ -49,12 +51,12 @@ public abstract class AbsGroupUtil implements IUtil, Runnable {
private DGTaskWrapper mGTWrapper; private DGTaskWrapper mGTWrapper;
private GroupRunState mState; private GroupRunState mState;
protected AbsGroupUtil(IDGroupListener listener, DGTaskWrapper groupWrapper) { protected AbsGroupUtil(AbsTaskWrapper groupWrapper, IEventListener listener) {
mListener = listener; mListener = (IDGroupListener) listener;
mGTWrapper = groupWrapper; mGTWrapper = (DGTaskWrapper) groupWrapper;
mUpdateInterval = Configuration.getInstance().downloadCfg.getUpdateInterval(); mUpdateInterval = Configuration.getInstance().downloadCfg.getUpdateInterval();
mState = new GroupRunState(groupWrapper.getKey(), mListener, mState = new GroupRunState(groupWrapper.getKey(), mListener,
groupWrapper.getSubTaskWrapper().size(), mSubQueue); mGTWrapper.getSubTaskWrapper().size(), mSubQueue);
mScheduler = new Handler(Looper.getMainLooper(), SimpleSchedulers.newInstance(mState)); mScheduler = new Handler(Looper.getMainLooper(), SimpleSchedulers.newInstance(mState));
initState(); initState();
} }

@ -23,6 +23,7 @@ import com.arialyy.aria.core.group.GroupSendParams;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.IRecordHandler; import com.arialyy.aria.core.inf.IRecordHandler;
import com.arialyy.aria.core.inf.TaskSchedulerType; import com.arialyy.aria.core.inf.TaskSchedulerType;
import com.arialyy.aria.core.task.AbsTask;
import com.arialyy.aria.core.task.DownloadGroupTask; import com.arialyy.aria.core.task.DownloadGroupTask;
import com.arialyy.aria.exception.BaseException; import com.arialyy.aria.exception.BaseException;
import com.arialyy.aria.util.ALog; import com.arialyy.aria.util.ALog;
@ -34,14 +35,14 @@ import com.arialyy.aria.util.RecordUtil;
* Created by Aria.Lao on 2017/7/20. 任务组下载事件 * Created by Aria.Lao on 2017/7/20. 任务组下载事件
*/ */
public class DownloadGroupListener public class DownloadGroupListener
extends BaseListener<DownloadGroupEntity, DGTaskWrapper, DownloadGroupTask> extends BaseListener<DownloadGroupEntity, DGTaskWrapper, AbsTask<DGTaskWrapper>>
implements IDGroupListener { implements IDGroupListener {
private GroupSendParams<DownloadGroupTask, DownloadEntity> mSeedEntity; private GroupSendParams<DownloadGroupTask, DownloadEntity> mSeedEntity;
public DownloadGroupListener(DownloadGroupTask task, Handler outHandler) { public DownloadGroupListener(AbsTask<DGTaskWrapper> task, Handler outHandler) {
super(task, outHandler); super(task, outHandler);
mSeedEntity = new GroupSendParams<>(); mSeedEntity = new GroupSendParams<>();
mSeedEntity.groupTask = task; mSeedEntity.groupTask = (DownloadGroupTask) task;
} }
@Override @Override

@ -37,7 +37,7 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
/** /**
* 当前线程的下去区间的进度 * 当前线程的下去区间的进度
*/ */
private long mRangeProgress = 0; private long mRangeProgress;
private ThreadRecord mThreadRecord; private ThreadRecord mThreadRecord;
private IThreadTaskObserver mObserver; private IThreadTaskObserver mObserver;
private AbsTaskWrapper mWrapper; private AbsTaskWrapper mWrapper;
@ -75,9 +75,7 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
return mThreadRecord; return mThreadRecord;
} }
@Deprecated
protected AbsTaskWrapper getTaskWrapper() { protected AbsTaskWrapper getTaskWrapper() {
// TODO: 2019-09-18 需要修改方法名称为:getWrapper
return mWrapper; return mWrapper;
} }
@ -95,9 +93,7 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
/** /**
* 获取线程配置信息 * 获取线程配置信息
*/ */
@Deprecated protected SubThreadConfig getThreadConfig() {
protected SubThreadConfig getConfig() {
// TODO: 2019-09-18 需要修改方法名称为:getThreadConfig
return mThreadConfig; return mThreadConfig;
} }
@ -108,7 +104,7 @@ public abstract class AbsThreadTaskAdapter implements IThreadTaskAdapter {
@Override public void setMaxSpeed(int speed) { @Override public void setMaxSpeed(int speed) {
if (mSpeedBandUtil == null) { if (mSpeedBandUtil == null) {
mSpeedBandUtil = mSpeedBandUtil =
new BandwidthLimiter(getTaskConfig().getMaxSpeed(), getConfig().startThreadNum); new BandwidthLimiter(getTaskConfig().getMaxSpeed(), getThreadConfig().startThreadNum);
} }
mSpeedBandUtil.setMaxRate(speed); mSpeedBandUtil.setMaxRate(speed);
} }

@ -25,8 +25,8 @@ import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.ThreadRecord; import com.arialyy.aria.core.ThreadRecord;
import com.arialyy.aria.core.common.SubThreadConfig; import com.arialyy.aria.core.common.SubThreadConfig;
import com.arialyy.aria.core.inf.IEntity; import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.core.inf.IThreadState; import com.arialyy.aria.core.inf.IThreadState;
import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.core.manager.ThreadTaskManager; import com.arialyy.aria.core.manager.ThreadTaskManager;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper; import com.arialyy.aria.core.wrapper.ITaskWrapper;
@ -62,16 +62,16 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
private Handler mStateHandler; private Handler mStateHandler;
private SubThreadConfig mConfig; private SubThreadConfig mConfig;
/** /**
* 当前子线程相对于总长度的位置 * 当前线程的下去区间的进度
*/ */
protected long mChildCurrentLocation = 0; private long mRangeProgress;
private IThreadTaskAdapter mAdapter; private IThreadTaskAdapter mAdapter;
protected ThreadRecord mRecord; private ThreadRecord mRecord;
private Thread mConfigThread = new Thread(new Runnable() { private Thread mConfigThread = new Thread(new Runnable() {
@Override public void run() { @Override public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
final long currentTemp = mChildCurrentLocation; final long currentTemp = mRangeProgress;
writeConfig(false, currentTemp); writeConfig(false, currentTemp);
} }
}); });
@ -86,7 +86,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
mConfigThreadPool = Executors.newCachedThreadPool(); mConfigThreadPool = Executors.newCachedThreadPool();
isNotNetRetry = AriaConfig.getInstance().getAConfig().isNotNetRetry(); isNotNetRetry = AriaConfig.getInstance().getAConfig().isNotNetRetry();
mChildCurrentLocation = mRecord.startLocation; mRangeProgress = mRecord.startLocation;
} }
/** /**
@ -94,6 +94,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
*/ */
public void setAdapter(IThreadTaskAdapter adapter) { public void setAdapter(IThreadTaskAdapter adapter) {
mAdapter = adapter; mAdapter = adapter;
mAdapter.setThreadStateObserver(this);
} }
/** /**
@ -166,7 +167,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
public void breakTask() { public void breakTask() {
taskBreak = true; taskBreak = true;
if (mTaskWrapper.isSupportBP()) { if (mTaskWrapper.isSupportBP()) {
final long currentTemp = mChildCurrentLocation; final long currentTemp = mRangeProgress;
updateState(IThreadState.STATE_STOP, null); updateState(IThreadState.STATE_STOP, null);
ALog.d(TAG, String.format("任务【%s】thread__%s__中断【停止位置:%s】", getFileName(), ALog.d(TAG, String.format("任务【%s】thread__%s__中断【停止位置:%s】", getFileName(),
mRecord.threadId, currentTemp)); mRecord.threadId, currentTemp));
@ -239,7 +240,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
ALog.i(TAG, String.format("任务【%s】已停止", getFileName())); ALog.i(TAG, String.format("任务【%s】已停止", getFileName()));
} else { } else {
if (mTaskWrapper.isSupportBP()) { if (mTaskWrapper.isSupportBP()) {
final long stopLocation = mChildCurrentLocation; final long stopLocation = mRangeProgress;
ALog.d(TAG, ALog.d(TAG,
String.format("任务【%s】thread__%s__停止【当前线程停止位置:%s】", getFileName(), String.format("任务【%s】thread__%s__停止【当前线程停止位置:%s】", getFileName(),
mRecord.threadId, stopLocation)); mRecord.threadId, stopLocation));
@ -295,20 +296,20 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
* *
* @param needRetry 是否需要重试一般是网络错误才需要重试 * @param needRetry 是否需要重试一般是网络错误才需要重试
*/ */
@Override public void updateFailState(@Nullable BaseException e, boolean needRetry) { @Override public synchronized void updateFailState(@Nullable BaseException e, boolean needRetry) {
fail(mRangeProgress, e, needRetry);
} }
@Override @Override
public synchronized void updateProgress(long len) { public synchronized void updateProgress(long len) {
mChildCurrentLocation += len; mRangeProgress += len;
Thread loopThread = mStateHandler.getLooper().getThread(); Thread loopThread = mStateHandler.getLooper().getThread();
if (!loopThread.isAlive() || loopThread.isInterrupted()) { if (!loopThread.isAlive() || loopThread.isInterrupted()) {
return; return;
} }
mStateHandler.obtainMessage(IThreadState.STATE_RUNNING, len).sendToTarget(); mStateHandler.obtainMessage(IThreadState.STATE_RUNNING, len).sendToTarget();
if (System.currentTimeMillis() - mLastSaveTime > 5000 if (System.currentTimeMillis() - mLastSaveTime > 5000
&& mChildCurrentLocation < mRecord.endLocation) { && mRangeProgress < mRecord.endLocation) {
mLastSaveTime = System.currentTimeMillis(); mLastSaveTime = System.currentTimeMillis();
if (!mConfigThreadPool.isShutdown()) { if (!mConfigThreadPool.isShutdown()) {
mConfigThreadPool.execute(mConfigThread); mConfigThreadPool.execute(mConfigThread);
@ -327,16 +328,6 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
String.format("任务【%s】thread__%s__取消", getFileName(), mRecord.threadId)); String.format("任务【%s】thread__%s__取消", getFileName(), mRecord.threadId));
} }
/**
* 线程任务失败
*
* @param subCurrentLocation 当前线程下载进度
* @param ex 异常信息
*/
protected void fail(long subCurrentLocation, BaseException ex) {
fail(subCurrentLocation, ex, true);
}
/** /**
* 任务失败 * 任务失败
* *
@ -451,7 +442,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
/** /**
* 发送失败信息 * 发送失败信息
*/ */
protected void sendFailMsg(@Nullable BaseException e) { private void sendFailMsg(@Nullable BaseException e) {
if (e != null) { if (e != null) {
Bundle b = new Bundle(); Bundle b = new Bundle();
b.putSerializable(IThreadState.KEY_ERROR_INFO, e); b.putSerializable(IThreadState.KEY_ERROR_INFO, e);
@ -467,7 +458,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
* @param isComplete 当前线程是否完成 {@code true}完成 * @param isComplete 当前线程是否完成 {@code true}完成
* @param record 当前下载进度 * @param record 当前下载进度
*/ */
protected void writeConfig(boolean isComplete, final long record) { private void writeConfig(boolean isComplete, final long record) {
if (mRecord != null) { if (mRecord != null) {
mRecord.isComplete = isComplete; mRecord.isComplete = isComplete;
if (mConfig.isBlock) { if (mConfig.isBlock) {
@ -487,6 +478,7 @@ public class ThreadTask implements IThreadTask, IThreadTaskObserver {
isDestroy = false; isDestroy = false;
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
TrafficStats.setThreadStatsTag(UUID.randomUUID().toString().hashCode()); TrafficStats.setThreadStatsTag(UUID.randomUUID().toString().hashCode());
mAdapter.call(this);
return this; return this;
} }
} }

@ -20,10 +20,8 @@ import com.arialyy.aria.core.TaskOptionParams;
import com.arialyy.aria.core.inf.IEventHandler; import com.arialyy.aria.core.inf.IEventHandler;
import com.arialyy.aria.core.inf.ITaskOption; import com.arialyy.aria.core.inf.ITaskOption;
import com.arialyy.aria.core.inf.IUtil; import com.arialyy.aria.core.inf.IUtil;
import com.arialyy.aria.core.listener.BaseListener;
import com.arialyy.aria.core.listener.IEventListener; import com.arialyy.aria.core.listener.IEventListener;
import com.arialyy.aria.core.task.AbsTask; import com.arialyy.aria.core.task.AbsTask;
import com.arialyy.aria.core.task.ITask;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper; import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import com.arialyy.aria.core.wrapper.ITaskWrapper; import com.arialyy.aria.core.wrapper.ITaskWrapper;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
@ -42,8 +40,8 @@ public class ComponentUtil {
public static final int COMPONENT_TYPE_FTP = 2; public static final int COMPONENT_TYPE_FTP = 2;
public static final int COMPONENT_TYPE_M3U8 = 3; public static final int COMPONENT_TYPE_M3U8 = 3;
private static volatile ComponentUtil INSTANCE = null;
private String TAG = CommonUtil.getClassName(getClass()); private String TAG = CommonUtil.getClassName(getClass());
private static volatile ComponentUtil INSTANCE = null;
private ComponentUtil() { private ComponentUtil() {
@ -99,7 +97,7 @@ public class ComponentUtil {
* *
* @return 返回下载工具创建失败返回null * @return 返回下载工具创建失败返回null
*/ */
public <T extends IUtil> T buildUtil(ITaskWrapper wrapper, IEventListener listener) { public <T extends IUtil> T buildUtil(AbsTaskWrapper wrapper, IEventListener listener) {
int requestType = wrapper.getRequestType(); int requestType = wrapper.getRequestType();
String className = null; String className = null;
switch (requestType) { switch (requestType) {
@ -122,10 +120,10 @@ public class ComponentUtil {
className = "com.arialyy.aria.http.upload.HttpULoaderUtil"; className = "com.arialyy.aria.http.upload.HttpULoaderUtil";
break; break;
case ITaskWrapper.D_FTP_DIR: case ITaskWrapper.D_FTP_DIR:
className = "com.arialyy.aria.http.download.DGroupLoaderUtil"; className = "com.arialyy.aria.ftp.download.FtpDirDLoaderUtil";
break; break;
case ITaskWrapper.DG_HTTP: case ITaskWrapper.DG_HTTP:
className = "com.arialyy.aria.ftp.download.FtpDirDLoaderUtil"; className = "com.arialyy.aria.http.download.DGroupLoaderUtil";
break; break;
} }
if (className == null) { if (className == null) {
@ -158,7 +156,7 @@ public class ComponentUtil {
* @param wrapperType 任务类型{@link ITaskWrapper} * @param wrapperType 任务类型{@link ITaskWrapper}
* @return 返回事件监听如果创建失败返回null * @return 返回事件监听如果创建失败返回null
*/ */
public <T extends IEventListener> T buildListener(int wrapperType, ITask task, public <T extends IEventListener> T buildListener(int wrapperType, AbsTask task,
Handler outHandler) { Handler outHandler) {
String className = null, errorStr = "请添加FTP插件"; String className = null, errorStr = "请添加FTP插件";
switch (wrapperType) { switch (wrapperType) {
@ -217,6 +215,7 @@ public class ComponentUtil {
try { try {
taskOption = clazz.newInstance(); taskOption = clazz.newInstance();
for (Field field : fields) { for (Field field : fields) {
field.setAccessible(true);
Class type = field.getType(); Class type = field.getType();
String key = field.getName(); String key = field.getName();
if (type != SoftReference.class) { if (type != SoftReference.class) {

@ -73,6 +73,7 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:3.7.0' implementation 'com.github.bumptech.glide:glide:3.7.0'
implementation 'com.pddstudio:highlightjs-android:1.5.0' implementation 'com.pddstudio:highlightjs-android:1.5.0'
implementation 'org.greenrobot:eventbus:3.1.1' implementation 'org.greenrobot:eventbus:3.1.1'
implementation project(path: ':M3U8Component')
} }
repositories { repositories {
mavenCentral() mavenCentral()

@ -291,7 +291,7 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) { @Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
Uri uri = Uri.parse(m3u8Url); Uri uri = Uri.parse(m3u8Url);
String parentUrl = uri.getAuthority() + "://" + uri.getHost(); String parentUrl = "http://" + uri.getHost();
List<String> newUrls = new ArrayList<>(); List<String> newUrls = new ArrayList<>();
for (String url : tsUrls) { for (String url : tsUrls) {
newUrls.add(parentUrl + url); newUrls.add(parentUrl + url);
@ -325,12 +325,6 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
//}) //})
.setTsUrlConvert(new IVodTsUrlConverter() { .setTsUrlConvert(new IVodTsUrlConverter() {
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) { @Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
//int index = m3u8Url.lastIndexOf("/");
//String parentUrl = m3u8Url.substring(0, index + 1);
//List<String> newUrls = new ArrayList<>();
//for (String url : tsUrls) {
// newUrls.add(parentUrl + url);
//}
Uri uri = Uri.parse(m3u8Url); Uri uri = Uri.parse(m3u8Url);
String parentUrl = uri.getScheme() + "://" + uri.getHost(); String parentUrl = uri.getScheme() + "://" + uri.getHost();
List<String> newUrls = new ArrayList<>(); List<String> newUrls = new ArrayList<>();
@ -350,16 +344,6 @@ public class M3U8VodDLoadActivity extends BaseActivity<ActivityM3u8VodBinding> {
.generateIndexFile() .generateIndexFile()
.controller(ControllerType.CREATE_CONTROLLER) .controller(ControllerType.CREATE_CONTROLLER)
.create(); .create();
Aria.download(M3U8VodDLoadActivity.this)
.load(mUrl)
.useServerFileName(true)
.setFilePath(mFilePath, true)
.asM3U8().setTsUrlConvert(new IVodTsUrlConverter() {
@Override public List<String> convert(String m3u8Url, List<String> tsUrls) {
return null;
}
});
} }
private Class<BuilderController> c = BuilderController.class; private Class<BuilderController> c = BuilderController.class;

@ -77,6 +77,7 @@
/> />
<FrameLayout <FrameLayout
android:background="@color/white"
android:id="@+id/video_content" android:id="@+id/video_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="200dp"

@ -7,6 +7,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:background="@color/white"
> >
<SurfaceView <SurfaceView

Loading…
Cancel
Save