修复重构loader后,http上传失败的问题

This commit is contained in:
laoyuyu
2020-01-08 19:42:16 +08:00
parent 432ae1c145
commit 7c4012c021
28 changed files with 255 additions and 106 deletions

View File

@@ -38,7 +38,7 @@ public class EventMsgUtil {
private Map<Object, List<EventMethodInfo>> mEventMethods =
new ConcurrentHashMap<>();
private ArrayBlockingQueue<Object> mEventQueue = new ArrayBlockingQueue<>(10);
private ExecutorService mPool = Executors.newFixedThreadPool(10);
private ExecutorService mPool = Executors.newFixedThreadPool(5);
private EventMsgUtil() {
ExecutorService pool = Executors.newSingleThreadExecutor();

View File

@@ -217,36 +217,14 @@ public abstract class AbsGroupLoader implements ILoaderVisitor, ILoader {
@Override public void cancel() {
isCancel = true;
closeTimer();
onPreCancel();
mSubQueue.removeAllTask();
mListener.onCancel();
}
/**
* onCancel前的操作
*/
protected void onPreCancel() {
}
@Override public void stop() {
isStop = true;
closeTimer();
if (onPreStop()) {
return;
}
mSubQueue.stopAllTask();
}
/**
* onStop前的操作
*
* @return 返回{@code true},直接回调{@link IDGroupListener#onStop(long)}
*/
protected boolean onPreStop() {
return false;
closeTimer();
}
@Override public void run() {
@@ -265,6 +243,9 @@ public abstract class AbsGroupLoader implements ILoaderVisitor, ILoader {
closeTimer();
Looper.prepare();
Looper looper = Looper.myLooper();
if (looper == Looper.getMainLooper()) {
throw new IllegalThreadStateException("不能在主线程程序中调用Loader");
}
initState(looper);
getState().setSubSize(getWrapper().getSubTaskWrapper().size());
if (getState().getCompleteNum() != 0

View File

@@ -99,6 +99,8 @@ public abstract class AbsGroupLoaderUtil implements IUtil {
}
buildLoaderStructure();
new Thread(mLoader).start();
// MsgEvent 已经是在线程中使用了,不需要重开线程
mLoader.run();
//new Thread(mLoader).start();
}
}

View File

@@ -26,6 +26,7 @@ import com.arialyy.aria.core.loader.IRecordHandler;
import com.arialyy.aria.core.manager.ThreadTaskManager;
import com.arialyy.aria.exception.TaskException;
import com.arialyy.aria.util.ALog;
import com.arialyy.aria.util.CommonUtil;
import com.arialyy.aria.util.NetUtils;
import java.io.File;
@@ -34,7 +35,7 @@ import java.io.File;
* 该调度器生命周期和{@link AbsGroupLoaderUtil}生命周期一致
*/
final class SimpleSchedulers implements Handler.Callback {
private static final String TAG = "SimpleSchedulers";
private final String TAG = CommonUtil.getClassName(this);
private SimpleSubQueue mQueue;
private GroupRunState mGState;
private String mKey; // 组合任务的key

View File

@@ -58,11 +58,7 @@ final class SimpleSubQueue implements ISubQueue<AbsSubDLoadUtil> {
return new SimpleSubQueue();
}
Map<String, AbsSubDLoadUtil> getExec() {
return mExec;
}
AbsSubDLoadUtil getLoaderUtil(String key) {
synchronized AbsSubDLoadUtil getLoaderUtil(String key) {
AbsSubDLoadUtil sub = mExec.get(key);
if (sub != null) {
return sub;

View File

@@ -0,0 +1,73 @@
/*
* 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.core.group;
import com.arialyy.aria.core.TaskRecord;
import com.arialyy.aria.core.ThreadRecord;
import com.arialyy.aria.core.common.RecordHandler;
import com.arialyy.aria.core.common.RecordHelper;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.wrapper.AbsTaskWrapper;
import java.util.ArrayList;
/**
* 子任务记录处理
*/
public class SubRecordHandler extends RecordHandler {
public SubRecordHandler(AbsTaskWrapper wrapper) {
super(wrapper);
}
@Override public void handlerTaskRecord(TaskRecord record) {
RecordHelper helper = new RecordHelper(getWrapper(), record);
helper.handleSingleThreadRecord();
}
@Override
public ThreadRecord createThreadRecord(TaskRecord record, int threadId, long startL, long endL) {
ThreadRecord tr;
tr = new ThreadRecord();
tr.taskKey = record.filePath;
tr.threadId = threadId;
tr.startLocation = startL;
tr.isComplete = false;
tr.threadType = getEntity().getTaskType();
tr.endLocation = getFileSize();
tr.blockLen = getFileSize();
return tr;
}
@Override public TaskRecord createTaskRecord(int threadNum) {
TaskRecord record = new TaskRecord();
record.fileName = getEntity().getFileName();
record.filePath = getEntity().getFilePath();
record.fileLength = getFileSize();
record.threadRecords = new ArrayList<>();
record.threadNum = threadNum;
record.isBlock = false;
record.taskType = getEntity().getTaskType();
record.isGroupRecord = true;
if (getEntity() instanceof DownloadEntity) {
record.dGroupHash = ((DownloadEntity) getEntity()).getGroupHash();
}
return record;
}
@Override public int initTaskThreadNum() {
return 1;
}
}

View File

@@ -123,6 +123,9 @@ public abstract class AbsNormalLoader implements ILoaderVisitor, ILoader {
}
Looper.prepare();
Looper looper = Looper.myLooper();
if (looper == Looper.getMainLooper()){
throw new IllegalThreadStateException("不能在主线程程序中调用Loader");
}
isRuning = true;
resetState();
onPostPre();

View File

@@ -115,7 +115,9 @@ public abstract class AbsNormalLoaderUtil implements IUtil {
//}
BuildLoaderStructure();
new Thread(mLoader).start();
// MsgEvent 已经是在线程中使用了,不需要重开线程
mLoader.run();
//new Thread(mLoader).start();
onStart();
}

View File

@@ -26,6 +26,7 @@ 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.CommonUtil;
import com.arialyy.aria.util.ComponentUtil;
import java.util.HashMap;
import java.util.Map;
@@ -63,11 +64,9 @@ public abstract class AbsTask<TASK_WRAPPER extends AbsTaskWrapper>
return mOutHandler;
}
protected abstract IUtil createUtil();
protected synchronized IUtil getUtil() {
if (mUtil == null) {
mUtil = createUtil();
mUtil = ComponentUtil.getInstance().buildUtil(mTaskWrapper, mListener);
}
return mUtil;
}
@@ -214,8 +213,8 @@ public abstract class AbsTask<TASK_WRAPPER extends AbsTaskWrapper>
@Override public void start(int type) {
mSchedulerType = type;
mUtil = createUtil();
if (mUtil == null){
mUtil = getUtil();
if (mUtil == null) {
ALog.e(TAG, "任务工具创建失败");
return;
}
@@ -240,8 +239,8 @@ public abstract class AbsTask<TASK_WRAPPER extends AbsTaskWrapper>
}
@Override public void stop(int type) {
mUtil = createUtil();
if (mUtil == null){
mUtil = getUtil();
if (mUtil == null) {
ALog.e(TAG, "任务工具创建失败");
return;
}
@@ -255,8 +254,8 @@ public abstract class AbsTask<TASK_WRAPPER extends AbsTaskWrapper>
}
@Override public void cancel(int type) {
mUtil = createUtil();
if (mUtil == null){
mUtil = getUtil();
if (mUtil == null) {
ALog.e(TAG, "任务工具创建失败");
return;
}

View File

@@ -21,9 +21,7 @@ import android.text.TextUtils;
import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.download.DGTaskWrapper;
import com.arialyy.aria.core.download.DownloadGroupEntity;
import com.arialyy.aria.core.inf.IUtil;
import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.util.CheckUtil;
import com.arialyy.aria.util.ComponentUtil;
/**
@@ -53,10 +51,6 @@ public class DownloadGroupTask extends AbsGroupTask<DGTaskWrapper> {
return DOWNLOAD_GROUP;
}
@Override protected synchronized IUtil createUtil() {
return ComponentUtil.getInstance().buildUtil(mTaskWrapper, mListener);
}
public static class Builder {
DGTaskWrapper taskEntity;
Handler outHandler;

View File

@@ -21,7 +21,6 @@ import android.os.Looper;
import com.arialyy.aria.core.AriaConfig;
import com.arialyy.aria.core.download.DTaskWrapper;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.inf.IUtil;
import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.util.ComponentUtil;
@@ -75,10 +74,6 @@ public class DownloadTask extends AbsTask<DTaskWrapper> {
return mTaskWrapper.getEntity().getFileName();
}
@Override protected synchronized IUtil createUtil() {
return ComponentUtil.getInstance().buildUtil(mTaskWrapper, mListener);
}
public static class Builder {
DTaskWrapper taskEntity;
Handler outHandler;

View File

@@ -17,7 +17,6 @@ package com.arialyy.aria.core.task;
import android.os.Handler;
import android.os.Looper;
import com.arialyy.aria.core.inf.IUtil;
import com.arialyy.aria.core.listener.ISchedulers;
import com.arialyy.aria.core.upload.UTaskWrapper;
import com.arialyy.aria.core.upload.UploadEntity;
@@ -51,10 +50,6 @@ public class UploadTask extends AbsTask<UTaskWrapper> {
return mTaskWrapper.getEntity().getFileName();
}
@Override protected synchronized IUtil createUtil() {
return ComponentUtil.getInstance().buildUtil(mTaskWrapper, mListener);
}
public static class Builder {
private Handler mOutHandler;
private UTaskWrapper mTaskEntity;

View File

@@ -98,7 +98,8 @@ public class ComponentUtil {
*
* @return 返回下载工具创建失败返回null
*/
public <T extends IUtil> T buildUtil(AbsTaskWrapper wrapper, IEventListener listener) {
public synchronized <T extends IUtil> T buildUtil(AbsTaskWrapper wrapper,
IEventListener listener) {
int requestType = wrapper.getRequestType();
String className = null;
switch (requestType) {
@@ -158,7 +159,7 @@ public class ComponentUtil {
* @param wrapperType 任务类型{@link ITaskWrapper}
* @return 返回事件监听如果创建失败返回null
*/
public <T extends IEventListener> T buildListener(int wrapperType, AbsTask task,
public synchronized <T extends IEventListener> T buildListener(int wrapperType, AbsTask task,
Handler outHandler) {
String className = null, errorStr = "请添加FTP插件";
switch (wrapperType) {
@@ -211,7 +212,8 @@ public class ComponentUtil {
* @param params 任务配置信息参数
* @return 构建失败返回null
*/
public <T extends ITaskOption> T buildTaskOption(Class<T> clazz, TaskOptionParams params) {
public synchronized <T extends ITaskOption> T buildTaskOption(Class<T> clazz,
TaskOptionParams params) {
List<Field> fields = CommonUtil.getAllFields(clazz);
T taskOption = null;
try {