loader 重构

This commit is contained in:
laoyuyu
2020-01-01 14:43:52 +08:00
170 changed files with 2862 additions and 21661 deletions

View File

@@ -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";
/**

View File

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

View File

@@ -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

View File

@@ -29,7 +29,7 @@ import java.util.Map;
/**
* Http任务设置的信息cookie、请求参数
*/
public class HttpTaskOption implements ITaskOption {
public final class HttpTaskOption implements ITaskOption {
private CookieManager cookieManager;

View File

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

View File

@@ -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();

View File

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

View File

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

View File

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

View File

@@ -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());

View File

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

View File

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

View File

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