loader 重构
This commit is contained in:
@@ -43,7 +43,7 @@ import javax.net.ssl.SSLSocketFactory;
|
||||
/**
|
||||
* Created by lyy on 2017/1/18. 链接帮助类
|
||||
*/
|
||||
public class ConnectionHelp {
|
||||
public final class ConnectionHelp {
|
||||
private static final String TAG = "ConnectionHelp";
|
||||
|
||||
/**
|
||||
|
||||
@@ -55,7 +55,7 @@ import java.util.UUID;
|
||||
/**
|
||||
* 下载文件信息获取
|
||||
*/
|
||||
public class HttpFileInfoTask implements IInfoTask, Runnable {
|
||||
public final class HttpFileInfoTask implements IInfoTask, Runnable {
|
||||
private static final String TAG = "HttpFileInfoThread";
|
||||
private DownloadEntity mEntity;
|
||||
private DTaskWrapper mTaskWrapper;
|
||||
@@ -129,7 +129,7 @@ public class HttpFileInfoTask implements IInfoTask, Runnable {
|
||||
}
|
||||
long len = lenAdapter.handleFileLen(conn.getHeaderFields());
|
||||
|
||||
if (!FileUtil.checkSDMemorySpace(mEntity.getFilePath(), len)) {
|
||||
if (!FileUtil.checkMemorySpace(mEntity.getFilePath(), len)) {
|
||||
failDownload(new TaskException(TAG,
|
||||
String.format("下载失败,内存空间不足;filePath: %s, url: %s", mEntity.getDownloadPath(),
|
||||
mEntity.getUrl())), false);
|
||||
|
||||
@@ -31,7 +31,7 @@ import java.util.ArrayList;
|
||||
* @Author lyy
|
||||
* @Date 2019-09-23
|
||||
*/
|
||||
public class HttpRecordHandler extends RecordHandler {
|
||||
public final class HttpRecordHandler extends RecordHandler {
|
||||
public HttpRecordHandler(AbsTaskWrapper wrapper) {
|
||||
super(wrapper);
|
||||
}
|
||||
@@ -45,7 +45,7 @@ public class HttpRecordHandler extends RecordHandler {
|
||||
|
||||
@Override public void handlerTaskRecord(TaskRecord record) {
|
||||
RecordHelper helper = new RecordHelper(getWrapper(), record);
|
||||
if (getWrapper().isSupportBP()) {
|
||||
if (getWrapper().isSupportBP() && record.threadNum > 1) {
|
||||
if (record.isBlock) {
|
||||
helper.handleBlockRecord();
|
||||
} else {
|
||||
@@ -70,10 +70,10 @@ public class HttpRecordHandler extends RecordHandler {
|
||||
tr.threadType = getEntity().getTaskType();
|
||||
//最后一个线程的结束位置即为文件的总长度
|
||||
if (threadId == (record.threadNum - 1)) {
|
||||
endL = getEntity().getFileSize();
|
||||
endL = getFileSize();
|
||||
}
|
||||
tr.endLocation = endL;
|
||||
tr.blockLen = RecordUtil.getBlockLen(getEntity().getFileSize(), threadId, record.threadNum);
|
||||
tr.blockLen = RecordUtil.getBlockLen(getFileSize(), threadId, record.threadNum);
|
||||
return tr;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ public class HttpRecordHandler extends RecordHandler {
|
||||
return 1;
|
||||
}
|
||||
int threadNum = Configuration.getInstance().downloadCfg.getThreadNum();
|
||||
return getEntity().getFileSize() <= IRecordHandler.SUB_LEN
|
||||
return getFileSize() <= IRecordHandler.SUB_LEN
|
||||
|| getEntity().isGroupChild()
|
||||
|| threadNum == 1
|
||||
? 1
|
||||
|
||||
@@ -29,7 +29,7 @@ import java.util.Map;
|
||||
/**
|
||||
* Http任务设置的信息,如:cookie、请求参数
|
||||
*/
|
||||
public class HttpTaskOption implements ITaskOption {
|
||||
public final class HttpTaskOption implements ITaskOption {
|
||||
|
||||
private CookieManager cookieManager;
|
||||
|
||||
|
||||
@@ -1,194 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.http.download;
|
||||
|
||||
import com.arialyy.aria.core.common.AbsEntity;
|
||||
import com.arialyy.aria.core.common.CompleteInfo;
|
||||
import com.arialyy.aria.core.download.DTaskWrapper;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.inf.IEntity;
|
||||
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.BaseException;
|
||||
import com.arialyy.aria.core.group.AbsGroupLoaderUtil;
|
||||
import com.arialyy.aria.core.group.AbsSubDLoadUtil;
|
||||
import com.arialyy.aria.http.HttpFileInfoTask;
|
||||
import com.arialyy.aria.http.HttpTaskOption;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* Created by AriaL on 2017/6/30.
|
||||
* 任务组下载工具
|
||||
*/
|
||||
public class DGroupLoaderUtil extends AbsGroupLoaderUtil {
|
||||
private final Object LOCK = new Object();
|
||||
private ExecutorService mPool = null;
|
||||
private boolean getLenComplete = false;
|
||||
private List<DTaskWrapper> mTempWrapper = new ArrayList<>();
|
||||
|
||||
public DGroupLoaderUtil(AbsTaskWrapper taskWrapper, IEventListener listener) {
|
||||
super(taskWrapper, listener);
|
||||
taskWrapper.generateTaskOption(HttpTaskOption.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbsSubDLoadUtil createSubLoader(DTaskWrapper wrapper, boolean needGetFileInfo) {
|
||||
return new HttpSubDLoaderUtil(getScheduler(), wrapper, needGetFileInfo);
|
||||
}
|
||||
|
||||
@Override public void onPreCancel() {
|
||||
super.onPreCancel();
|
||||
}
|
||||
|
||||
@Override protected boolean onPreStop() {
|
||||
// 如果是isUnknownSize()标志,并且获取大小没有完成,则直接回调onStop
|
||||
if (mPool != null && !getLenComplete) {
|
||||
ALog.d(TAG, "获取长度未完成的情况下,停止组合任务");
|
||||
mPool.shutdown();
|
||||
mListener.onStop(0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override protected boolean onStart() {
|
||||
super.onStart();
|
||||
getState().setSubSize(getWrapper().getSubTaskWrapper().size());
|
||||
if (getState().getCompleteNum() == getState().getSubSize()) {
|
||||
mListener.onComplete();
|
||||
return false;
|
||||
} else {
|
||||
// 处理组合任务大小未知的情况
|
||||
if (getWrapper().isUnknownSize() && getWrapper().getEntity().getFileSize() < 1) {
|
||||
mPool = Executors.newCachedThreadPool();
|
||||
getGroupSize();
|
||||
try {
|
||||
synchronized (LOCK) {
|
||||
LOCK.wait();
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return getLenComplete;
|
||||
} else {
|
||||
for (DTaskWrapper wrapper : getWrapper().getSubTaskWrapper()) {
|
||||
cloneHeader(wrapper);
|
||||
if (wrapper.getState() != IEntity.STATE_COMPLETE) {
|
||||
startSubLoader(createSubLoader(wrapper, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取组合任务大小,使用该方式获取到的组合任务大小,子任务不需要再重新获取文件大小
|
||||
*/
|
||||
private void getGroupSize() {
|
||||
new Thread(new Runnable() {
|
||||
int count;
|
||||
int failCount;
|
||||
|
||||
@Override public void run() {
|
||||
for (DTaskWrapper dTaskWrapper : getWrapper().getSubTaskWrapper()) {
|
||||
cloneHeader(dTaskWrapper);
|
||||
mPool.submit(new HttpFileInfoTask(dTaskWrapper, new OnFileInfoCallback() {
|
||||
@Override public void onComplete(String url, CompleteInfo info) {
|
||||
if (!getWrapper().isUnknownSize()) {
|
||||
startSubLoader(createSubLoader((DTaskWrapper) info.wrapper, false));
|
||||
} else {
|
||||
mTempWrapper.add((DTaskWrapper) info.wrapper);
|
||||
}
|
||||
count++;
|
||||
checkGetSizeComplete(count, failCount);
|
||||
ALog.d(TAG, "获取子任务信息完成");
|
||||
}
|
||||
|
||||
@Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) {
|
||||
ALog.e(TAG, String.format("获取文件信息失败,url:%s", ((DownloadEntity) entity).getUrl()));
|
||||
count++;
|
||||
failCount++;
|
||||
mListener.onSubFail((DownloadEntity) entity, new AriaIOException(TAG,
|
||||
String.format("子任务获取文件长度失败,url:%s", ((DownloadEntity) entity).getUrl())));
|
||||
checkGetSizeComplete(count, failCount);
|
||||
getState().countFailNum(entity.getKey());
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查组合任务大小是否获取完成,获取完成后取消阻塞,并设置组合任务大小
|
||||
*/
|
||||
private void checkGetSizeComplete(int count, int failCount) {
|
||||
if (failCount == getWrapper().getSubTaskWrapper().size()) {
|
||||
getState().setRunning(false);
|
||||
mListener.onFail(false, new AriaIOException(TAG, "获取子任务长度失败"));
|
||||
notifyLock();
|
||||
return;
|
||||
}
|
||||
if (count == getWrapper().getSubTaskWrapper().size()) {
|
||||
long size = 0;
|
||||
for (DTaskWrapper wrapper : getWrapper().getSubTaskWrapper()) {
|
||||
size += wrapper.getEntity().getFileSize();
|
||||
}
|
||||
getWrapper().getEntity().setConvertFileSize(CommonUtil.formatFileSize(size));
|
||||
getWrapper().getEntity().setFileSize(size);
|
||||
getWrapper().getEntity().update();
|
||||
getLenComplete = true;
|
||||
ALog.d(TAG, String.format("获取组合任务长度完成,组合任务总长度:%s,失败的只任务数:%s", size, failCount));
|
||||
// 未知大小的组合任务,延迟下载
|
||||
if (getWrapper().isUnknownSize()) {
|
||||
for (DTaskWrapper wrapper : mTempWrapper) {
|
||||
startSubLoader(createSubLoader(wrapper, false));
|
||||
}
|
||||
}
|
||||
notifyLock();
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyLock() {
|
||||
synchronized (LOCK) {
|
||||
LOCK.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 子任务使用父包裹器的属性
|
||||
*/
|
||||
private void cloneHeader(DTaskWrapper taskWrapper) {
|
||||
HttpTaskOption groupOption = (HttpTaskOption) getWrapper().getTaskOption();
|
||||
HttpTaskOption subOption = new HttpTaskOption();
|
||||
|
||||
// 设置属性
|
||||
subOption.setFileLenAdapter(groupOption.getFileLenAdapter());
|
||||
subOption.setRequestEnum(groupOption.getRequestEnum());
|
||||
subOption.setHeaders(groupOption.getHeaders());
|
||||
subOption.setProxy(groupOption.getProxy());
|
||||
subOption.setParams(groupOption.getParams());
|
||||
taskWrapper.setTaskOption(subOption);
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.http;
|
||||
package com.arialyy.aria.http.download;
|
||||
|
||||
import com.arialyy.aria.core.common.AbsEntity;
|
||||
import com.arialyy.aria.core.common.CompleteInfo;
|
||||
@@ -25,6 +25,8 @@ import com.arialyy.aria.core.loader.IInfoTask;
|
||||
import com.arialyy.aria.core.loader.ILoaderVisitor;
|
||||
import com.arialyy.aria.exception.AriaIOException;
|
||||
import com.arialyy.aria.exception.BaseException;
|
||||
import com.arialyy.aria.http.HttpFileInfoTask;
|
||||
import com.arialyy.aria.http.HttpTaskOption;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@@ -33,7 +35,7 @@ import java.util.concurrent.Executors;
|
||||
/**
|
||||
* 组合任务文件信息,用于获取长度未知时,组合任务的长度
|
||||
*/
|
||||
public class HttpGroupInfoTask implements IInfoTask {
|
||||
public final class HttpDGInfoTask implements IInfoTask {
|
||||
private String TAG = CommonUtil.getClassName(this);
|
||||
private Callback callback;
|
||||
private DGTaskWrapper wrapper;
|
||||
@@ -64,7 +66,7 @@ public class HttpGroupInfoTask implements IInfoTask {
|
||||
}
|
||||
};
|
||||
|
||||
public HttpGroupInfoTask(DGTaskWrapper wrapper, DownloadGroupListener listener) {
|
||||
public HttpDGInfoTask(DGTaskWrapper wrapper, DownloadGroupListener listener) {
|
||||
this.wrapper = wrapper;
|
||||
this.listener = listener;
|
||||
}
|
||||
@@ -96,7 +98,7 @@ public class HttpGroupInfoTask implements IInfoTask {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/*z
|
||||
* 获取组合任务大小,使用该方式获取到的组合任务大小,子任务不需要再重新获取文件大小
|
||||
*/
|
||||
private void getGroupSize() {
|
||||
@@ -106,6 +108,7 @@ public class HttpGroupInfoTask implements IInfoTask {
|
||||
cloneHeader(dTaskWrapper);
|
||||
HttpFileInfoTask infoTask = new HttpFileInfoTask(dTaskWrapper);
|
||||
infoTask.setCallback(subCallback);
|
||||
mPool.execute(infoTask);
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.http.download;
|
||||
|
||||
import android.os.Looper;
|
||||
import com.arialyy.aria.core.common.AbsEntity;
|
||||
import com.arialyy.aria.core.common.CompleteInfo;
|
||||
import com.arialyy.aria.core.download.DTaskWrapper;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.group.AbsGroupLoader;
|
||||
import com.arialyy.aria.core.group.AbsSubDLoadUtil;
|
||||
import com.arialyy.aria.core.listener.IEventListener;
|
||||
import com.arialyy.aria.core.loader.IInfoTask;
|
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
import com.arialyy.aria.exception.BaseException;
|
||||
|
||||
/**
|
||||
* http 组合任务加载器
|
||||
*/
|
||||
final class HttpDGLoader extends AbsGroupLoader {
|
||||
HttpDGLoader(AbsTaskWrapper groupWrapper, IEventListener listener) {
|
||||
super(groupWrapper, listener);
|
||||
}
|
||||
|
||||
@Override protected void handlerTask(Looper looper) {
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
mInfoTask.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AbsSubDLoadUtil createSubLoader(DTaskWrapper wrapper, boolean needGetFileInfo) {
|
||||
return new HttpSubDLoaderUtil(wrapper, getScheduler(), needGetFileInfo);
|
||||
}
|
||||
|
||||
private void startSub() {
|
||||
if (isBreak()) {
|
||||
return;
|
||||
}
|
||||
for (DTaskWrapper wrapper : getWrapper().getSubTaskWrapper()) {
|
||||
DownloadEntity dEntity = wrapper.getEntity();
|
||||
startSubLoader(createSubLoader(wrapper, dEntity.getFileSize() < 0));
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void addComponent(IInfoTask infoTask) {
|
||||
mInfoTask = infoTask;
|
||||
mInfoTask.setCallback(new IInfoTask.Callback() {
|
||||
@Override public void onSucceed(String key, CompleteInfo info) {
|
||||
startSub();
|
||||
}
|
||||
|
||||
@Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) {
|
||||
mListener.onFail(needRetry, e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.arialyy.aria.http.download;
|
||||
|
||||
import com.arialyy.aria.core.download.DGTaskWrapper;
|
||||
import com.arialyy.aria.core.group.AbsGroupLoader;
|
||||
import com.arialyy.aria.core.group.AbsGroupLoaderUtil;
|
||||
import com.arialyy.aria.core.listener.DownloadGroupListener;
|
||||
import com.arialyy.aria.core.listener.IEventListener;
|
||||
import com.arialyy.aria.core.loader.LoaderStructure;
|
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
import com.arialyy.aria.http.HttpTaskOption;
|
||||
|
||||
/**
|
||||
* Created by AriaL on 2017/6/30.
|
||||
* 任务组下载工具
|
||||
*/
|
||||
public final class HttpDGLoaderUtil extends AbsGroupLoaderUtil {
|
||||
|
||||
public HttpDGLoaderUtil(AbsTaskWrapper taskWrapper, IEventListener listener) {
|
||||
super(taskWrapper, listener);
|
||||
taskWrapper.generateTaskOption(HttpTaskOption.class);
|
||||
}
|
||||
|
||||
@Override protected AbsGroupLoader getLoader() {
|
||||
return mLoader == null ? new HttpDGLoader(getTaskWrapper(), getListener()) : mLoader;
|
||||
}
|
||||
|
||||
@Override protected LoaderStructure buildLoaderStructure() {
|
||||
LoaderStructure structure = new LoaderStructure();
|
||||
structure.addComponent(new HttpDGInfoTask((DGTaskWrapper) getTaskWrapper(),
|
||||
(DownloadGroupListener) getListener()));
|
||||
structure.accept(getLoader());
|
||||
return structure;
|
||||
}
|
||||
}
|
||||
@@ -1,100 +0,0 @@
|
||||
///*
|
||||
// * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria)
|
||||
// *
|
||||
// * Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// * you may not use this file except in compliance with the License.
|
||||
// * You may obtain a copy of the License at
|
||||
// *
|
||||
// * http://www.apache.org/licenses/LICENSE-2.0
|
||||
// *
|
||||
// * Unless required by applicable law or agreed to in writing, software
|
||||
// * distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// * See the License for the specific language governing permissions and
|
||||
// * limitations under the License.
|
||||
// */
|
||||
//package com.arialyy.aria.http.download;
|
||||
//
|
||||
//import com.arialyy.aria.core.TaskRecord;
|
||||
//import com.arialyy.aria.core.common.RecordHandler;
|
||||
//import com.arialyy.aria.core.common.SubThreadConfig;
|
||||
//import com.arialyy.aria.core.download.DownloadEntity;
|
||||
//import com.arialyy.aria.core.loader.IRecordHandler;
|
||||
//import com.arialyy.aria.core.task.AbsNormalLoaderAdapter;
|
||||
//import com.arialyy.aria.core.task.IThreadTask;
|
||||
//import com.arialyy.aria.core.task.ThreadTask;
|
||||
//import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
//import com.arialyy.aria.core.wrapper.ITaskWrapper;
|
||||
//import com.arialyy.aria.http.HttpRecordHandler;
|
||||
//import com.arialyy.aria.util.ALog;
|
||||
//import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||
//import com.arialyy.aria.util.FileUtil;
|
||||
//import java.io.File;
|
||||
//import java.io.IOException;
|
||||
//
|
||||
///**
|
||||
// * @Author lyy
|
||||
// * @Date 2019-09-21
|
||||
// */
|
||||
//final class HttpDLoaderAdapter extends AbsNormalLoaderAdapter {
|
||||
// HttpDLoaderAdapter(ITaskWrapper wrapper) {
|
||||
// super(wrapper);
|
||||
// }
|
||||
//
|
||||
// @Override public boolean handleNewTask(TaskRecord record, int totalThreadNum) {
|
||||
// if (!record.isBlock) {
|
||||
// if (getTempFile().exists()) {
|
||||
// FileUtil.deleteFile(getTempFile());
|
||||
// }
|
||||
// } else {
|
||||
// for (int i = 0; i < totalThreadNum; i++) {
|
||||
// File blockFile =
|
||||
// new File(String.format(IRecordHandler.SUB_PATH, getTempFile().getPath(), i));
|
||||
// if (blockFile.exists()) {
|
||||
// ALog.d(TAG, String.format("分块【%s】已经存在,将删除该分块", i));
|
||||
// FileUtil.deleteFile(blockFile);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// BufferedRandomAccessFile file = null;
|
||||
// try {
|
||||
// if (totalThreadNum > 1 && !record.isBlock) {
|
||||
// file = new BufferedRandomAccessFile(new File(getTempFile().getPath()), "rwd", 8192);
|
||||
// //设置文件长度
|
||||
// file.setLength(getEntity().getFileSize());
|
||||
// }
|
||||
// return true;
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// ALog.e(TAG, String.format("下载失败,filePath: %s, url: %s", getEntity().getFilePath(),
|
||||
// getEntity().getUrl()));
|
||||
// } finally {
|
||||
// if (file != null) {
|
||||
// try {
|
||||
// file.close();
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return false;
|
||||
// }
|
||||
//
|
||||
// @Override public IThreadTask createThreadTask(SubThreadConfig config) {
|
||||
// ThreadTask task = new ThreadTask(config);
|
||||
// HttpDThreadTaskAdapter adapter = new HttpDThreadTaskAdapter(config);
|
||||
// task.setAdapter(adapter);
|
||||
// return task;
|
||||
// }
|
||||
//
|
||||
// @Override public IRecordHandler recordHandler(AbsTaskWrapper wrapper) {
|
||||
// RecordHandler recordHandler = new RecordHandler(wrapper);
|
||||
// HttpRecordHandler adapter = new HttpRecordHandler(wrapper);
|
||||
// recordHandler.setAdapter(adapter);
|
||||
// return recordHandler;
|
||||
// }
|
||||
//
|
||||
// private DownloadEntity getEntity() {
|
||||
// return (DownloadEntity) getWrapper().getEntity();
|
||||
// }
|
||||
//}
|
||||
@@ -17,11 +17,11 @@ package com.arialyy.aria.http.download;
|
||||
|
||||
import com.arialyy.aria.core.download.DTaskWrapper;
|
||||
import com.arialyy.aria.core.listener.IEventListener;
|
||||
import com.arialyy.aria.core.loader.AbsLoader;
|
||||
import com.arialyy.aria.core.loader.AbsNormalLoader;
|
||||
import com.arialyy.aria.core.loader.AbsNormalLoaderUtil;
|
||||
import com.arialyy.aria.core.loader.LoaderStructure;
|
||||
import com.arialyy.aria.core.loader.NormalLoader;
|
||||
import com.arialyy.aria.core.loader.ThreadStateManager;
|
||||
import com.arialyy.aria.core.loader.NormalThreadStateManager;
|
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
import com.arialyy.aria.http.HttpFileInfoTask;
|
||||
import com.arialyy.aria.http.HttpRecordHandler;
|
||||
@@ -31,20 +31,20 @@ import com.arialyy.aria.http.HttpTaskOption;
|
||||
* @Author lyy
|
||||
* @Date 2019-09-21
|
||||
*/
|
||||
public class HttpDLoaderUtil extends AbsNormalLoaderUtil {
|
||||
public final class HttpDLoaderUtil extends AbsNormalLoaderUtil {
|
||||
public HttpDLoaderUtil(AbsTaskWrapper wrapper, IEventListener listener) {
|
||||
super(wrapper, listener);
|
||||
wrapper.generateTaskOption(HttpTaskOption.class);
|
||||
}
|
||||
|
||||
@Override public AbsLoader getLoader() {
|
||||
@Override public AbsNormalLoader getLoader() {
|
||||
return mLoader == null ? new NormalLoader(getTaskWrapper(), getListener()) : mLoader;
|
||||
}
|
||||
|
||||
public LoaderStructure getLoaderStructure() {
|
||||
public LoaderStructure BuildLoaderStructure() {
|
||||
LoaderStructure structure = new LoaderStructure();
|
||||
structure.addComponent(new HttpRecordHandler(getTaskWrapper()))
|
||||
.addComponent(new ThreadStateManager(getListener()))
|
||||
.addComponent(new NormalThreadStateManager(getListener()))
|
||||
.addComponent(new HttpFileInfoTask((DTaskWrapper) getTaskWrapper()))
|
||||
.addComponent(new HttpDTTBuilder(getTaskWrapper()));
|
||||
structure.accept(getLoader());
|
||||
|
||||
@@ -16,52 +16,41 @@
|
||||
package com.arialyy.aria.http.download;
|
||||
|
||||
import android.os.Handler;
|
||||
import com.arialyy.aria.core.common.AbsEntity;
|
||||
import com.arialyy.aria.core.common.CompleteInfo;
|
||||
import com.arialyy.aria.core.download.DTaskWrapper;
|
||||
import com.arialyy.aria.core.group.AbsSubDLoadUtil;
|
||||
import com.arialyy.aria.core.group.ChildDLoadListener;
|
||||
import com.arialyy.aria.core.inf.OnFileInfoCallback;
|
||||
import com.arialyy.aria.core.listener.ISchedulers;
|
||||
import com.arialyy.aria.core.loader.NormalLoader;
|
||||
import com.arialyy.aria.exception.BaseException;
|
||||
import com.arialyy.aria.core.loader.LoaderStructure;
|
||||
import com.arialyy.aria.core.loader.SubLoader;
|
||||
import com.arialyy.aria.http.HttpFileInfoTask;
|
||||
import com.arialyy.aria.http.HttpRecordHandler;
|
||||
|
||||
/**
|
||||
* @Author lyy
|
||||
* @Date 2019-09-28
|
||||
*/
|
||||
class HttpSubDLoaderUtil extends AbsSubDLoadUtil {
|
||||
final class HttpSubDLoaderUtil extends AbsSubDLoadUtil {
|
||||
/**
|
||||
* @param schedulers 调度器
|
||||
* @param needGetInfo {@code true} 需要获取文件信息。{@code false} 不需要获取文件信息
|
||||
*/
|
||||
HttpSubDLoaderUtil(Handler schedulers, DTaskWrapper taskWrapper, boolean needGetInfo) {
|
||||
super(schedulers, taskWrapper, needGetInfo);
|
||||
HttpSubDLoaderUtil(DTaskWrapper taskWrapper, Handler schedulers, boolean needGetInfo) {
|
||||
super(taskWrapper, schedulers, needGetInfo);
|
||||
}
|
||||
|
||||
@Override protected NormalLoader createLoader(ChildDLoadListener listener, DTaskWrapper wrapper) {
|
||||
NormalLoader loader = new NormalLoader(listener, wrapper);
|
||||
HttpDLoaderAdapter adapter = new HttpDLoaderAdapter(wrapper);
|
||||
loader.setAdapter(adapter);
|
||||
return loader;
|
||||
}
|
||||
|
||||
@Override public void start() {
|
||||
if (isNeedGetInfo()) {
|
||||
new Thread(new HttpFileInfoTask(getWrapper(), new OnFileInfoCallback() {
|
||||
|
||||
@Override public void onComplete(String url, CompleteInfo info) {
|
||||
getDownloader().start();
|
||||
}
|
||||
|
||||
@Override public void onFail(AbsEntity entity, BaseException e, boolean needRetry) {
|
||||
getSchedulers().obtainMessage(ISchedulers.FAIL, HttpSubDLoaderUtil.this).sendToTarget();
|
||||
}
|
||||
})).start();
|
||||
} else {
|
||||
getDownloader().start();
|
||||
@Override protected SubLoader getLoader() {
|
||||
if (mDLoader == null) {
|
||||
mDLoader = new SubLoader(getWrapper(), getSchedulers());
|
||||
mDLoader.setNeedGetInfo(isNeedGetInfo());
|
||||
}
|
||||
return mDLoader;
|
||||
}
|
||||
|
||||
@Override protected LoaderStructure buildLoaderStructure() {
|
||||
LoaderStructure structure = new LoaderStructure();
|
||||
structure.addComponent(new HttpRecordHandler(getWrapper()))
|
||||
.addComponent(new HttpDTTBuilder(getWrapper()))
|
||||
.addComponent(new HttpFileInfoTask(getWrapper()));
|
||||
structure.accept(getLoader());
|
||||
return structure;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,35 +15,39 @@
|
||||
*/
|
||||
package com.arialyy.aria.http.upload;
|
||||
|
||||
import com.arialyy.aria.core.download.DTaskWrapper;
|
||||
import com.arialyy.aria.core.listener.IEventListener;
|
||||
import com.arialyy.aria.core.loader.AbsLoader;
|
||||
import com.arialyy.aria.core.loader.AbsNormalLoader;
|
||||
import com.arialyy.aria.core.loader.AbsNormalLoaderUtil;
|
||||
import com.arialyy.aria.core.loader.LoaderStructure;
|
||||
import com.arialyy.aria.core.loader.NormalLoader;
|
||||
import com.arialyy.aria.core.loader.NormalThreadStateManager;
|
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
import com.arialyy.aria.http.HttpFileInfoTask;
|
||||
import com.arialyy.aria.http.HttpRecordHandler;
|
||||
import com.arialyy.aria.http.HttpTaskOption;
|
||||
|
||||
/**
|
||||
* @Author lyy
|
||||
* @Date 2019-09-19
|
||||
*/
|
||||
public class HttpULoaderUtil extends AbsNormalLoaderUtil {
|
||||
public final class HttpULoaderUtil extends AbsNormalLoaderUtil {
|
||||
public HttpULoaderUtil(AbsTaskWrapper wrapper, IEventListener listener) {
|
||||
super(wrapper, listener);
|
||||
wrapper.generateTaskOption(HttpTaskOption.class);
|
||||
}
|
||||
|
||||
@Override protected AbsLoader createLoader() {
|
||||
NormalLoader loader = new NormalLoader(getListener(), getTaskWrapper());
|
||||
HttpULoaderAdapter adapter = new HttpULoaderAdapter(getTaskWrapper());
|
||||
loader.setAdapter(adapter);
|
||||
return loader;
|
||||
@Override public AbsNormalLoader getLoader() {
|
||||
return mLoader == null ? new NormalLoader(getTaskWrapper(), getListener()) : mLoader;
|
||||
}
|
||||
|
||||
@Override protected Runnable createInfoThread() {
|
||||
return new Runnable() {
|
||||
@Override public void run() {
|
||||
getLoader().start();
|
||||
}
|
||||
};
|
||||
@Override public LoaderStructure BuildLoaderStructure() {
|
||||
LoaderStructure structure = new LoaderStructure();
|
||||
structure.addComponent(new HttpRecordHandler(getTaskWrapper()))
|
||||
.addComponent(new NormalThreadStateManager(getListener()))
|
||||
.addComponent(new HttpFileInfoTask((DTaskWrapper) getTaskWrapper()))
|
||||
.addComponent(new HttpUTTBuilder(getTaskWrapper()));
|
||||
structure.accept(getLoader());
|
||||
return structure;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,40 +16,26 @@
|
||||
package com.arialyy.aria.http.upload;
|
||||
|
||||
import com.arialyy.aria.core.TaskRecord;
|
||||
import com.arialyy.aria.core.common.RecordHandler;
|
||||
import com.arialyy.aria.core.common.SubThreadConfig;
|
||||
import com.arialyy.aria.core.loader.IRecordHandler;
|
||||
import com.arialyy.aria.core.task.AbsNormalLoaderAdapter;
|
||||
import com.arialyy.aria.core.task.IThreadTask;
|
||||
import com.arialyy.aria.core.task.ThreadTask;
|
||||
import com.arialyy.aria.core.loader.AbsNormalTTBuilder;
|
||||
import com.arialyy.aria.core.task.IThreadTaskAdapter;
|
||||
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
|
||||
import com.arialyy.aria.core.wrapper.ITaskWrapper;
|
||||
import com.arialyy.aria.http.HttpRecordHandler;
|
||||
|
||||
/**
|
||||
* @Author lyy
|
||||
* @Date 2019-09-19
|
||||
*/
|
||||
final class HttpULoaderAdapter extends AbsNormalLoaderAdapter {
|
||||
public HttpULoaderAdapter(ITaskWrapper wrapper) {
|
||||
final class HttpUTTBuilder extends AbsNormalTTBuilder {
|
||||
|
||||
HttpUTTBuilder(AbsTaskWrapper wrapper) {
|
||||
super(wrapper);
|
||||
}
|
||||
|
||||
@Override public IThreadTaskAdapter getAdapter(SubThreadConfig config) {
|
||||
return new HttpUThreadTaskAdapter(config);
|
||||
}
|
||||
|
||||
@Override public boolean handleNewTask(TaskRecord record, int totalThreadNum) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override public IThreadTask createThreadTask(SubThreadConfig config) {
|
||||
ThreadTask task = new ThreadTask(config);
|
||||
HttpUThreadTaskAdapter adapter = new HttpUThreadTaskAdapter(config);
|
||||
task.setAdapter(adapter);
|
||||
return task;
|
||||
}
|
||||
|
||||
@Override public IRecordHandler recordHandler(AbsTaskWrapper wrapper) {
|
||||
RecordHandler recordHandler = new RecordHandler(wrapper);
|
||||
HttpRecordHandler adapter = new HttpRecordHandler(wrapper);
|
||||
recordHandler.setAdapter(adapter);
|
||||
return recordHandler;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user