diff --git a/README.md b/README.md index 87dbf1d..c85e6e0 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ EasyAndroid.init(application) - [EasyReflect](#easyreflect): 反射操作组件 - [EasyActivityResult](#easyactivityresult): onActivityResult解耦组件 - [EasyPermissions](#easypermissions): 动态权限申请组件 +- [EasyExecutor](#easyexecutor): 线程池封装组件 - [MVP](#mvp): 简单MVP架构 ### [EasyDimension](./docs/EasyDimension.md) @@ -199,6 +200,38 @@ EasyPermissions.create(// 指定待申请权限 .request() ``` +### [EasyExecutor](./docs/EasyExecutor.md) + +> 用于进行`安全`、`高效`、`便利`的线程池操作功能组件 + +- **安全**: 直接catch住任务执行期间出现的异常。并通知给用户,避免出现crash +- **回调通知**: 执行任务期间,有分别的生命周期作为通知。 +- **配置灵活**: 可方便、灵活的对每次所启动的任务,配置线程名、回调等。 +- **任务延迟**: 支持在每次启动任务前。指定延迟时间 +- **异步任务**: 支持直接启动异步任务并回调传递数据 +- **线程切换**: 支持指定回调方法所在的线程。默认为运行于UI线程中 + +用法示例 + +``` +// 1. 第一步:创建示例 +val executor = + // size为所需创建的线程池的大小。当size <= 0时。 + // 表示需要使用newCachedThreadPool。 + EasyExecutor.newBuilder(size) + .setName(name)// 默认的线程名 + .setPriority(priority)// 线程池中创建线程的优先级 + .onStart {threadName -> } // 默认任务启动时的回调 + .onSuccess {threadName -> }// 默认任务执行完毕后的回调 + .onError {threadName, throwable -> }// 默认任务执行出现异常时的回调 + .setDeliver(deliver)// 默认的回调任务派发器。用于将信息派发到指定线程去。 + .build()// 最后。执行创建 + +// 2. 第二步:启动任务 +executor.execute(runnable:Runnable)// 启动普通任务 +executor.async(callable:Callable, result:(T) -> Unit)// 启动异步回调任务 +``` + ### [MVP](./docs/MVP.md) > 提供的一种简单的MVP分层架构实现。 diff --git a/docs/EasyExecutor.md b/docs/EasyExecutor.md new file mode 100644 index 0000000..d6e9b4a --- /dev/null +++ b/docs/EasyExecutor.md @@ -0,0 +1,68 @@ +# EasyExecutor + +用于进行`安全`、`高效`、`便利`的线程池操作功能组件 + +[Sample Activity](../app/src/main/java/com/haoge/sample/easyandroid/activities/EasyExecutorActivity.kt) + +## 特性 + +- **安全**: 直接catch住任务执行期间出现的异常。并通知给用户,避免出现crash +- **回调通知**: 执行任务期间,有分别的生命周期作为通知。 +- **配置灵活**: 可方便、灵活的对每次所启动的任务,配置线程名、回调等。 +- **任务延迟**: 支持在每次启动任务前。指定延迟时间 +- **异步任务**: 支持直接启动异步任务并回调传递数据 +- **线程切换**: 支持指定回调方法所在的线程。默认为运行于UI线程中 + +## 用法 + +### 创建配置EasyExecutor实例 + +``` +val executor = + // size为所需创建的线程池的大小。当size <= 0时。 + // 表示需要使用newCachedThreadPool。 + EasyExecutor.newBuilder(size) + .setName(name)// 默认的线程名 + .setPriority(priority)// 线程池中创建线程的优先级 + .onStart {threadName -> } // 默认任务启动时的回调 + .onSuccess {threadName -> }// 默认任务执行完毕后的回调 + .onError {threadName, throwable -> }// 默认任务执行出现异常时的回调 + .setDeliver(deliver)// 默认的回调任务派发器。用于将信息派发到指定线程去。 + .build()// 最后。执行创建 +``` + +### 启动普通任务 + +``` +executor.execute(runnable:Runnable) +``` + +### 启动异步任务 + +``` +executor.async(task:Callable, result:(T)->Unit) +``` + +### 延时启动任务 + +``` +executor.setDelay(time)// 单位为毫秒,在启动任务前调用即可 + .execute(runnable:Runnable) +``` + +### 设置当前执行任务名 + +``` +executor.setName(name)// 只针对当前此的任务进行任务名重置 +``` + +### 设置当前执行回调任务 + +``` +// 只被当前次的任务所触发。且不拦截创建时指定的默认回调 +executor.onStart {threadName -> } + .onSuccess {threadName -> } + .onError {threadName, throwable -> } +``` + + diff --git a/utils/src/main/java/com/haoge/easyandroid/easy/EasyExecutor.kt b/utils/src/main/java/com/haoge/easyandroid/easy/EasyExecutor.kt index 54012f2..3b23746 100644 --- a/utils/src/main/java/com/haoge/easyandroid/easy/EasyExecutor.kt +++ b/utils/src/main/java/com/haoge/easyandroid/easy/EasyExecutor.kt @@ -15,11 +15,17 @@ class EasyExecutor private constructor(val executor: ExecutorService, private val builder: Builder) { private var delay:Long = 0 + private var name:String? = null private var success:SUCCESS? = null private var error:ERROR? = null private var start:START? = null private var deliver:Executor? = null + fun setName(name:String):EasyExecutor { + this.name = name + return this + } + fun setDelay(delay:Long):EasyExecutor { this.delay = Math.max(delay, 0) return this @@ -180,9 +186,9 @@ class EasyExecutor private constructor(val executor: ExecutorService, private var success:SUCCESS? = executor.success private var error:ERROR? = executor.error private var start:START? = executor.start + private var name:String = executor.name?:builder.name override fun run() { - val name = Thread.currentThread().name Thread.currentThread().setUncaughtExceptionHandler { _, e -> deliver.execute { @@ -190,6 +196,7 @@ class EasyExecutor private constructor(val executor: ExecutorService, error?.invoke(name, e) } } + Thread.currentThread().name = name deliver.execute { builder.start?.invoke(name) start?.invoke(name) diff --git a/utils/src/main/java/com/haoge/easyandroid/tools/ActivityStack.kt b/utils/src/main/java/com/haoge/easyandroid/tools/ActivityStack.kt index a998084..6979b12 100644 --- a/utils/src/main/java/com/haoge/easyandroid/tools/ActivityStack.kt +++ b/utils/src/main/java/com/haoge/easyandroid/tools/ActivityStack.kt @@ -12,7 +12,8 @@ import java.util.* */ object ActivityStack { private var application: Application? = null - val stack:LinkedList = LinkedList() + + private val stack:LinkedList = LinkedList() /** * 获取顶层Activity实例 @@ -34,18 +35,21 @@ object ActivityStack { application?.registerActivityLifecycleCallbacks(Callback()) } + @Synchronized fun push(activity: Activity) { if (!stack.contains(activity)) { stack.addLast(activity) } } + @Synchronized fun pop(activity: Activity) { if (stack.contains(activity)) { stack.remove(activity) } } + @Synchronized fun pop() { if (!stack.isEmpty()) { val pop = stack.pop()