apt 实现

This commit is contained in:
AriaLyy
2017-06-07 18:13:04 +08:00
parent 190c2b3a05
commit 8049af34e0
23 changed files with 809 additions and 50 deletions

View File

@ -68,6 +68,22 @@ public class DownloadReceiver implements IReceiver<DownloadEntity> {
return this;
}
/**
* 将当前类注册到Aria
*/
public DownloadReceiver register() {
DownloadSchedulers.getInstance().register(targetName);
return this;
}
/**
* 取消注册
*/
public DownloadReceiver unRegister() {
DownloadSchedulers.getInstance().unRegister(targetName);
return this;
}
/**
* 移除回调
*/

View File

@ -0,0 +1,59 @@
/*
* 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.scheduler;
import com.arialyy.aria.core.inf.ITask;
/**
* Created by Aria.Lao on 2017/6/7.
*/
public class AbsSchedulerListener<TASK extends ITask> implements ISchedulerListener<TASK> {
@Override public void onPre(TASK task) {
}
@Override public void onTaskPre(TASK task) {
}
@Override public void onTaskResume(TASK task) {
}
@Override public void onTaskStart(TASK task) {
}
@Override public void onTaskStop(TASK task) {
}
@Override public void onTaskCancel(TASK task) {
}
@Override public void onTaskFail(TASK task) {
}
@Override public void onTaskComplete(TASK task) {
}
@Override public void onTaskRunning(TASK task) {
}
}

View File

@ -26,27 +26,40 @@ import com.arialyy.aria.core.inf.IEntity;
import com.arialyy.aria.core.inf.ITask;
import com.arialyy.aria.core.queue.ITaskQueue;
import com.arialyy.aria.core.upload.UploadTask;
import com.arialyy.compiler.ProxyConstance;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by AriaL on 2017/6/4.
* Created by lyy on 2017/6/4.
*/
public abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY extends AbsEntity, TASK extends ITask<ENTITY>, QUEUE extends ITaskQueue<TASK, TASK_ENTITY, ENTITY>>
implements ISchedulers<TASK> {
private static final String TAG = "AbsSchedulers";
protected QUEUE mQueue;
protected boolean isDownload = true;
private Map<String, ISchedulerListener<TASK>> mSchedulerListeners = new ConcurrentHashMap<>();
@Override
public void addSchedulerListener(String targetName, ISchedulerListener<TASK> schedulerListener) {
private Map<String, AbsSchedulerListener<TASK>> mObservers = new ConcurrentHashMap<>();
/**
* @param targetName 观察者,创建该监听器的对象类名
* @param schedulerListener {@link ISchedulerListener}
* @see #register(String)
*/
@Deprecated @Override public void addSchedulerListener(String targetName,
ISchedulerListener<TASK> schedulerListener) {
mSchedulerListeners.put(targetName, schedulerListener);
}
/**
* @param targetName 观察者,创建该监听器的对象类名
* @see #unRegister(String)
*/
@Override public void removeSchedulerListener(String targetName,
ISchedulerListener<TASK> schedulerListener) {
//该内存泄露解决方案http://stackoverflow.com/questions/14585829/how-safe-is-to-delete-already-removed-concurrenthashmap-element
@ -57,6 +70,46 @@ public abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY ex
}
}
@Override public void register(String targetName) {
AbsSchedulerListener<TASK> listener = mObservers.get(targetName);
if (listener == null) {
mObservers.put(targetName, createListener(targetName));
}
}
@Override public void unRegister(String targetName) {
for (Iterator<Map.Entry<String, AbsSchedulerListener<TASK>>> iter =
mObservers.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry<String, AbsSchedulerListener<TASK>> entry = iter.next();
if (entry.getKey().equals(targetName)) iter.remove();
}
}
/**
* 创建代理类
*
* @param targetName 通过观察者创建对应的Aria事件代理
*/
private AbsSchedulerListener<TASK> createListener(String targetName) {
AbsSchedulerListener<TASK> listener = null;
try {
Class clazz = Class.forName(
targetName + (isDownload ? ProxyConstance.DOWNLOAD_PROXY_CLASS_SUFFIX
: ProxyConstance.UPLOAD_PROXY_CLASS_SUFFIX));
listener = (AbsSchedulerListener<TASK>) clazz.newInstance();
} catch (ClassNotFoundException e) {
Log.e(TAG, targetName + "没有Aria的Download或Upload注解方法");
//e.printStackTrace();
} catch (InstantiationException e) {
Log.e(TAG, e.getMessage());
//e.printStackTrace();
} catch (IllegalAccessException e) {
Log.e(TAG, e.getMessage());
//e.printStackTrace();
}
return listener;
}
@Override public boolean handleMessage(Message msg) {
TASK task = (TASK) msg.obj;
if (task == null) {
@ -98,7 +151,12 @@ public abstract class AbsSchedulers<TASK_ENTITY extends AbsTaskEntity, ENTITY ex
if (mSchedulerListeners.size() > 0) {
Set<String> keys = mSchedulerListeners.keySet();
for (String key : keys) {
callback(state, task, mSchedulerListeners.get(key));
if (mSchedulerListeners.size() > 0) {
callback(state, task, mSchedulerListeners.get(key));
}
if (mObservers.size() > 0) {
callback(state, task, mObservers.get(key));
}
}
}
}

View File

@ -34,6 +34,7 @@ public class DownloadSchedulers
private DownloadSchedulers() {
mQueue = DownloadTaskQueue.getInstance();
isDownload = true;
}
public static DownloadSchedulers getInstance() {

View File

@ -80,4 +80,18 @@ public interface ISchedulers<Task extends ITask> extends Handler.Callback {
*/
public void removeSchedulerListener(String targetName,
ISchedulerListener<Task> schedulerListener);
/**
* 将当前类注册到Aria
*
* @param targetName 类完整路径
*/
public void register(String targetName);
/**
* 移除注册
*
* @param targetName 类完整路径
*/
public void unRegister(String targetName);
}

View File

@ -32,6 +32,7 @@ public class UploadSchedulers
private UploadSchedulers() {
mQueue = UploadTaskQueue.getInstance();
isDownload = false;
}
public static UploadSchedulers getInstance() {