任务组子任务控制

pull/330/head
AriaLyy 7 years ago
parent 7fb25e1f65
commit bd16e05ed2
  1. 25
      Aria/src/main/java/com/arialyy/aria/core/download/DownloadGroupListener.java
  2. 34
      Aria/src/main/java/com/arialyy/aria/core/inf/GroupSendParams.java
  3. 18
      Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulerListener.java
  4. 48
      Aria/src/main/java/com/arialyy/aria/core/scheduler/AbsSchedulers.java
  5. 2
      AriaCompiler/src/main/java/com/arialyy/compiler/ElementHandler.java
  6. 6
      AriaCompiler/src/main/java/com/arialyy/compiler/EventProxyFiler.java
  7. 4
      AriaCompiler/src/main/java/com/arialyy/compiler/ParamObtainUtil.java
  8. 2
      AriaCompiler/src/main/java/com/arialyy/compiler/ProxyClassParam.java
  9. 9
      AriaCompiler/src/main/java/com/arialyy/compiler/TaskEnum.java
  10. 14
      app/src/main/java/com/arialyy/simple/download/SingleTaskActivity.java
  11. 8
      app/src/main/java/com/arialyy/simple/download/group/DownloadGroupActivity.java

@ -17,6 +17,7 @@ package com.arialyy.aria.core.download;
import android.os.Handler;
import com.arialyy.aria.core.download.downloader.IDownloadGroupListener;
import com.arialyy.aria.core.inf.GroupSendParams;
import com.arialyy.aria.core.scheduler.ISchedulers;
/**
@ -26,13 +27,16 @@ import com.arialyy.aria.core.scheduler.ISchedulers;
class DownloadGroupListener extends BaseDListener<DownloadGroupEntity, DownloadGroupTask>
implements IDownloadGroupListener {
private final String TAG = "DownloadGroupListener";
private GroupSendParams<DownloadGroupTask, DownloadEntity> mSeedEntity;
DownloadGroupListener(DownloadGroupTask task, Handler outHandler) {
super(task, outHandler);
mSeedEntity = new GroupSendParams<>();
mSeedEntity.groupTask = task;
}
@Override public void onSubPre(DownloadEntity subEntity) {
sendInState2Target(ISchedulers.SUB_PRE);
sendInState2Target(ISchedulers.SUB_PRE, subEntity);
}
@Override public void supportBreakpoint(boolean support, DownloadEntity subEntity) {
@ -40,31 +44,31 @@ class DownloadGroupListener extends BaseDListener<DownloadGroupEntity, DownloadG
}
@Override public void onSubStart(DownloadEntity subEntity) {
sendInState2Target(ISchedulers.SUB_START);
sendInState2Target(ISchedulers.SUB_START, subEntity);
}
@Override public void onSubStop(DownloadEntity subEntity) {
saveCurrentLocation();
sendInState2Target(ISchedulers.SUB_STOP);
sendInState2Target(ISchedulers.SUB_STOP, subEntity);
}
@Override public void onSubComplete(DownloadEntity subEntity) {
saveCurrentLocation();
sendInState2Target(ISchedulers.SUB_COMPLETE);
sendInState2Target(ISchedulers.SUB_COMPLETE, subEntity);
}
@Override public void onSubFail(DownloadEntity subEntity) {
saveCurrentLocation();
sendInState2Target(ISchedulers.SUB_FAIL);
sendInState2Target(ISchedulers.SUB_FAIL, subEntity);
}
@Override public void onSubCancel(DownloadEntity entity) {
@Override public void onSubCancel(DownloadEntity subEntity) {
saveCurrentLocation();
sendInState2Target(ISchedulers.SUB_CANCEL);
sendInState2Target(ISchedulers.SUB_CANCEL, subEntity);
}
@Override public void onSubRunning(DownloadEntity subEntity) {
sendInState2Target(ISchedulers.SUB_RUNNING);
sendInState2Target(ISchedulers.SUB_RUNNING, subEntity);
}
/**
@ -72,9 +76,10 @@ class DownloadGroupListener extends BaseDListener<DownloadGroupEntity, DownloadG
*
* @param state {@link ISchedulers#START}
*/
private void sendInState2Target(int state) {
private void sendInState2Target(int state, DownloadEntity subEntity) {
if (outHandler.get() != null) {
outHandler.get().obtainMessage(state, ISchedulers.IS_SUB_TASK, 0, mTask).sendToTarget();
mSeedEntity.entity = subEntity;
outHandler.get().obtainMessage(state, ISchedulers.IS_SUB_TASK, 0, mSeedEntity).sendToTarget();
}
}

@ -0,0 +1,34 @@
/*
* 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.inf;
/**
* Created by lyy on 2017/9/8.
* 任务组参数传递
*/
public class GroupSendParams<GROUP_TASK extends AbsGroupTask, ENTITY extends AbsNormalEntity> {
public GROUP_TASK groupTask;
public ENTITY entity;
public GroupSendParams() {
}
public GroupSendParams(GROUP_TASK groupTask, ENTITY entity) {
this.groupTask = groupTask;
this.entity = entity;
}
}

@ -15,13 +15,13 @@
*/
package com.arialyy.aria.core.scheduler;
import com.arialyy.aria.core.inf.AbsNormalTask;
import com.arialyy.aria.core.inf.AbsNormalEntity;
import com.arialyy.aria.core.inf.ITask;
/**
* Created by Aria.Lao on 2017/6/7.
*/
public class AbsSchedulerListener<TASK extends ITask, SUB_TASK extends AbsNormalTask> implements ISchedulerListener<TASK> {
public class AbsSchedulerListener<TASK extends ITask, SUB_ENTITY extends AbsNormalEntity> implements ISchedulerListener<TASK> {
@Override public void onPre(TASK task) {
@ -67,31 +67,31 @@ public class AbsSchedulerListener<TASK extends ITask, SUB_TASK extends AbsNormal
}
public void onSubTaskPre(TASK task, SUB_TASK subTask) {
public void onSubTaskPre(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskStart(TASK task, SUB_TASK subTask) {
public void onSubTaskStart(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskStop(TASK task, SUB_TASK subTask) {
public void onSubTaskStop(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskCancel(TASK task, SUB_TASK subTask) {
public void onSubTaskCancel(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskComplete(TASK task, SUB_TASK subTask) {
public void onSubTaskComplete(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskFail(TASK task, SUB_TASK subTask) {
public void onSubTaskFail(TASK task, SUB_ENTITY subTask) {
}
public void onSubTaskRunning(TASK task, SUB_TASK subTask) {
public void onSubTaskRunning(TASK task, SUB_ENTITY subTask) {
}
}

@ -21,9 +21,10 @@ import android.util.Log;
import com.arialyy.aria.core.AriaManager;
import com.arialyy.aria.core.download.DownloadTask;
import com.arialyy.aria.core.inf.AbsEntity;
import com.arialyy.aria.core.inf.AbsNormalTask;
import com.arialyy.aria.core.inf.AbsNormalEntity;
import com.arialyy.aria.core.inf.AbsTask;
import com.arialyy.aria.core.inf.AbsTaskEntity;
import com.arialyy.aria.core.inf.GroupSendParams;
import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.queue.ITaskQueue;
import com.arialyy.aria.core.upload.UploadTask;
@ -46,7 +47,8 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
protected QUEUE mQueue;
private Map<String, AbsSchedulerListener<TASK, AbsNormalTask>> mObservers = new ConcurrentHashMap<>();
private Map<String, AbsSchedulerListener<TASK, AbsNormalEntity>> mObservers =
new ConcurrentHashMap<>();
/**
* 设置调度器类型
@ -60,7 +62,7 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
@Override public void register(Object obj) {
String targetName = obj.getClass().getName();
AbsSchedulerListener<TASK, AbsNormalTask> listener = mObservers.get(targetName);
AbsSchedulerListener<TASK, AbsNormalEntity> listener = mObservers.get(targetName);
if (listener == null) {
listener = createListener(targetName);
if (listener != null) {
@ -73,9 +75,9 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
}
@Override public void unRegister(Object obj) {
for (Iterator<Map.Entry<String, AbsSchedulerListener<TASK, AbsNormalTask>>> iter =
for (Iterator<Map.Entry<String, AbsSchedulerListener<TASK, AbsNormalEntity>>> iter =
mObservers.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry<String, AbsSchedulerListener<TASK, AbsNormalTask>> entry = iter.next();
Map.Entry<String, AbsSchedulerListener<TASK, AbsNormalEntity>> entry = iter.next();
if (entry.getKey().equals(obj.getClass().getName())) iter.remove();
}
}
@ -85,11 +87,11 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
*
* @param targetName 通过观察者创建对应的Aria事件代理
*/
private AbsSchedulerListener<TASK, AbsNormalTask> createListener(String targetName) {
AbsSchedulerListener<TASK, AbsNormalTask> listener = null;
private AbsSchedulerListener<TASK, AbsNormalEntity> createListener(String targetName) {
AbsSchedulerListener<TASK, AbsNormalEntity> listener = null;
try {
Class clazz = Class.forName(targetName + getProxySuffix());
listener = (AbsSchedulerListener<TASK, AbsNormalTask>) clazz.newInstance();
listener = (AbsSchedulerListener<TASK, AbsNormalEntity>) clazz.newInstance();
} catch (ClassNotFoundException e) {
Log.e(TAG, targetName + ",没有Aria的Download或Upload注解方法");
} catch (InstantiationException e) {
@ -101,49 +103,54 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
}
@Override public boolean handleMessage(Message msg) {
if (msg.arg1 == IS_SUB_TASK) {
return handleSubEvent(msg);
}
TASK task = (TASK) msg.obj;
if (task == null) {
Log.e(TAG, "请传入下载任务");
return true;
}
if (msg.arg1 == IS_SUB_TASK) {
handleSubEvent(task, msg.what);
} else {
handleNormalEvent(task, msg.what);
}
return true;
}
/**
* 处理任务组子任务事件
*/
private void handleSubEvent(TASK task, int what) {
ENTITY entity = task.getEntity();
private boolean handleSubEvent(Message msg) {
GroupSendParams params = (GroupSendParams) msg.obj;
if (mObservers.size() > 0) {
Set<String> keys = mObservers.keySet();
for (String key : keys) {
AbsSchedulerListener<TASK, AbsNormalTask> listener = mObservers.get(key);
switch (what) {
AbsSchedulerListener<TASK, AbsNormalEntity> listener = mObservers.get(key);
switch (msg.what) {
case SUB_PRE:
//listener.onSubTaskPre(task, );
listener.onSubTaskPre((TASK) params.groupTask, params.entity);
break;
case SUB_START:
listener.onSubTaskStart((TASK) params.groupTask, params.entity);
break;
case SUB_STOP:
listener.onSubTaskStop((TASK) params.groupTask, params.entity);
break;
case SUB_FAIL:
listener.onSubTaskFail((TASK) params.groupTask, params.entity);
break;
case SUB_RUNNING:
listener.onSubTaskRunning((TASK) params.groupTask, params.entity);
break;
case SUB_CANCEL:
listener.onSubTaskCancel((TASK) params.groupTask, params.entity);
break;
case SUB_COMPLETE:
listener.onSubTaskComplete((TASK) params.groupTask, params.entity);
break;
}
}
}
return true;
}
/**
@ -189,7 +196,8 @@ abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends A
}
}
private void callback(int state, TASK task, AbsSchedulerListener<TASK, AbsNormalTask> listener) {
private void callback(int state, TASK task,
AbsSchedulerListener<TASK, AbsNormalEntity> listener) {
if (listener != null) {
if (task == null) {
Log.e(TAG, "TASK 为null,回调失败");

@ -138,7 +138,7 @@ class ElementHandler {
void createProxyFile() {
try {
new EventProxyFiler(mFiler, mPbUtil).createEventProxyFile();
//new CountFiler(mFiler, mPbUtil).createCountFile();
new CountFiler(mFiler, mPbUtil).createCountFile();
} catch (IOException e) {
e.printStackTrace();
}

@ -112,7 +112,7 @@ final class EventProxyFiler {
String callCode;
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) {
callCode = "task, subTask";
callCode = "task, subEntity";
} else {
callCode = "task";
}
@ -143,9 +143,9 @@ final class EventProxyFiler {
//任务组接口
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) {
ClassName subTask = ClassName.get(TaskEnum.DOWNLOAD.pkg, TaskEnum.DOWNLOAD.className);
ClassName subTask = ClassName.get(TaskEnum.DOWNLOAD_ENTITY.pkg, TaskEnum.DOWNLOAD_ENTITY.className);
ParameterSpec subTaskParam =
ParameterSpec.builder(subTask, "subTask").addModifiers(Modifier.FINAL).build();
ParameterSpec.builder(subTask, "subEntity").addModifiers(Modifier.FINAL).build();
builder.addParameter(subTaskParam);
}

@ -84,7 +84,7 @@ class ParamObtainUtil {
proxyEntity.proxyClassName = proxyEntity.className + taskEnum.proxySuffix;
proxyEntity.mainTaskEnum = taskEnum;
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB || taskEnum == TaskEnum.DOWNLOAD_GROUP) {
proxyEntity.subTaskEnum = TaskEnum.DOWNLOAD;
proxyEntity.subTaskEnum = TaskEnum.DOWNLOAD_ENTITY;
}
mMethodParams.put(key, proxyEntity);
}
@ -214,7 +214,7 @@ class ParamObtainUtil {
*/
private String getCheckSubParams(TaskEnum taskEnum) {
if (taskEnum == TaskEnum.DOWNLOAD_GROUP_SUB) {
return TaskEnum.DOWNLOAD.pkg + "." + TaskEnum.DOWNLOAD.className;
return TaskEnum.DOWNLOAD_ENTITY.pkg + "." + TaskEnum.DOWNLOAD_ENTITY.className;
}
return "";
}

@ -44,7 +44,7 @@ class ProxyClassParam {
/**
* 子任务泛型参数
*/
TaskEnum subTaskEnum = TaskEnum.NORMAL;
TaskEnum subTaskEnum = TaskEnum.NORMAL_ENTITY;
Set<TaskEnum> taskEnums;
Map<String, Set<String>> keyMappings = new HashMap<>();

@ -23,10 +23,11 @@ enum TaskEnum {
DOWNLOAD("com.arialyy.aria.core.download", "DownloadTask",
"$$DownloadListenerProxy"), DOWNLOAD_GROUP("com.arialyy.aria.core.download",
"DownloadGroupTask", "$$DownloadGroupListenerProxy"), DOWNLOAD_GROUP_SUB(
"com.arialyy.aria.core.download", "DownloadGroupTask",
"$$DownloadGroupListenerProxy"), UPLOAD("com.arialyy.aria.core.upload", "UploadTask",
"$$UploadListenerProxy"), UPLOAD_GROUP("com.arialyy.aria.core.upload", "UploadGroupTask",
"$$UploadGroupListenerProxy"), NORMAL("com.arialyy.aria.core.inf", "AbsNormalTask", "");
"com.arialyy.aria.core.download", "DownloadGroupTask", "$$DownloadGroupListenerProxy"), UPLOAD(
"com.arialyy.aria.core.upload", "UploadTask", "$$UploadListenerProxy"), UPLOAD_GROUP(
"com.arialyy.aria.core.upload", "UploadGroupTask",
"$$UploadGroupListenerProxy"), NORMAL_ENTITY("com.arialyy.aria.core.inf", "AbsNormalEntity",
""), DOWNLOAD_ENTITY("com.arialyy.aria.core.download", "DownloadEntity", "");
String pkg, className, proxySuffix;

@ -18,7 +18,6 @@ package com.arialyy.simple.download;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -29,10 +28,10 @@ import butterknife.Bind;
import com.arialyy.annotations.Download;
import com.arialyy.annotations.DownloadGroup;
import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadGroupTask;
import com.arialyy.aria.core.download.DownloadTarget;
import com.arialyy.aria.core.download.DownloadTask;
import com.arialyy.aria.core.download.DownloadTaskEntity;
import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.util.CommonUtil;
import com.arialyy.frame.util.show.L;
@ -47,7 +46,8 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
private static final String DOWNLOAD_URL =
//"http://kotlinlang.org/docs/kotlin-docs.pdf";
//"https://atom-installer.github.com/v1.13.0/AtomSetup.exe?s=1484074138&ext=.exe";
"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
//"http://static.gaoshouyou.com/d/22/94/822260b849944492caadd2983f9bb624.apk";
"http://sitcac.daxincf.cn/wp-content/uploads/swift_vido/01/element.mp4";
//"http://120.25.196.56:8000/filereq?id=15692406294&ipncid=105635&client=android&filename=20170819185541.avi";
//"http://down2.xiaoshuofuwuqi.com/d/file/filetxt/20170608/14/%BA%DA%CE%D7%CA%A6%E1%C8%C6%F0.txt";
//"http://tinghuaapp.oss-cn-shanghai.aliyuncs.com/20170612201739607815";
@ -116,14 +116,6 @@ public class SingleTaskActivity extends BaseActivity<ActivitySingleBinding> {
return true;
}
@DownloadGroup.onSubTaskFail void onSubTaskFail(DownloadGroupTask groupTask, DownloadTask subTask){
}
@DownloadGroup.onPre void onGroupPre(DownloadGroupTask groupTask){
}
@Download.onPre(DOWNLOAD_URL) protected void onPre(DownloadTask task) {
setBtState(false);
}

@ -17,15 +17,14 @@ package com.arialyy.simple.download.group;
import android.os.Bundle;
import android.os.Environment;
import android.view.Gravity;
import android.view.View;
import butterknife.Bind;
import com.arialyy.annotations.DownloadGroup;
import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.download.DownloadGroupEntity;
import com.arialyy.aria.core.download.DownloadGroupTask;
import com.arialyy.aria.core.download.DownloadGroupTaskEntity;
import com.arialyy.frame.util.AndroidUtils;
import com.arialyy.frame.util.show.L;
import com.arialyy.frame.util.show.T;
import com.arialyy.simple.R;
@ -99,6 +98,11 @@ public class DownloadGroupActivity extends BaseActivity<ActivityDownloadGroupBin
}
}
@DownloadGroup.onSubTaskRunning void onSubTaskRunning(DownloadGroupTask groupTask,
DownloadEntity subEntity) {
L.d(TAG, subEntity.getPercent() + "");
}
@DownloadGroup.onPre() protected void onPre(DownloadGroupTask task) {
L.d(TAG, "group pre");
}

Loading…
Cancel
Save