背景很早之前接触了RxJava的工作流操作,感觉这种将简单业务流通过一个个操作符拆解开来,造成一条条条理清晰的function, 让人写起来直呼过瘾.其实这就是责任链模式的一种利用.
然而RxJava的性能切实是太强大了, 如果仅仅是应用它来解决这些业务流我感觉还是有些大材小用了.
之前也做过一段时间的利用性能优化, 其中当然就包含利用冷启动优化, 两头有波及过启动器的概念, 过后也查阅了一些现有的开源框架, 也应用过其中一些, 然而总感觉并不是很好用, 用起来不是很棘手.
作为一名资深Android开源框架卷王, 过后我脑海里就萌生一种想法, 为啥我不本人写一个工作流执行的框架呢?想到这, 我就抽出了我的一部分业余时间(女朋友都不陪了), 撸出了这个XTask框架, 自我感觉十分nice, 在这分享给大家.
简介XTask是一个拓展性极强的Android工作执行框架。
可自在定义和组合工作来实现你想要的性能,尤其实用于解决简单的业务流程,可灵便增加前置工作或者调整执行程序。例如:利用的启动初始化流程。
我的项目地址github: https://github.com/xuexiangjys/XTaskgitee: https://gitee.com/xuexiangjys/XTask特色反对6种线程类型形式执行工作。反对工作链中各工作的执行线程调度和管制。反对快捷工作创立,同时反对自定义工作。反对串行和并行等组工作。反对工作间数据共享。反对自由组合工作执行。反对工作链执行勾销。反对勾销所有工作链和指定名称的工作链。反对工作链调用程序记录和查问。反对自定义工作执行的线程池。设计思维框架主体应用责任链的设计模式,辅以建造者模式、工厂模式、适配器模式、组合模式、外观模式以及代理模式来实现。
组成构造工作链ITaskChainEngine:工作链执行引擎,负责兼顾调度各工作步骤。工作步骤ITaskStep:负责具体任务逻辑解决。数据存储仓库IDataStore:存放数据的仓库,次要用于保留工作参数中的数据。工作参数ITaskParam:负责工作门路记录以及工作产生的参数治理。工作执行后果ITaskResult:寄存工作最终执行的后果以及产生的数据。工作组IGroupTaskStep:负责兼顾调度各子工作步骤。点击查看框架UML设计图
日志一览
集成指南增加Gradle依赖1.先在我的项目根目录的 build.gradle 的 repositories 增加:
allprojects { repositories { ... maven { url "https://jitpack.io" } }}2.而后在dependencies增加:
dependencies { ... // XTask implementation 'com.github.xuexiangjys:XTask:xtask-core:1.0.0'}应用办法XTask作为对外对立的API入口,所有罕用的办法都能从中找到。关上调试模式当须要定位问题,须要进行调试时,可关上调试模式,这样便可开启框架的日志。
XTask.debug(true);XTask的API介绍办法名形容debug设置是否关上调试setLogger自定义日志打印setIsLogTaskRunThreadName设置是否打印工作执行所在的线程名,默认falsegetTaskChain获取工作链执行引擎getTask获取简化的工作getTaskBuilder获取简化工作的构建者getConcurrentGroupTask获取并行任务组getSerialGroupTask获取串行工作组cancelTaskChain勾销指定工作链执行postToMain执行工作到主线程submit执行一般异步工作emergentSubmit执行紧急异步工作backgroundSubmit执行后盾异步工作ioSubmit执行io耗时的异步工作groupSubmit执行分组异步工作如何执行一条工作链上面是一整个残缺的例子:
// 1.创立一条工作链(必须)final TaskChainEngine engine = XTask.getTaskChain();// 2.设置工作链的初始化参数(可选)engine.setTaskParam(TaskParam.get("chainName", engine.getName()));TaskParam taskParam = TaskParam.get("param1", 100) .put("param2", true);// 3.创立多个工作,并向工作链中增加(必须)XTaskStep taskStep = XTask.getTask(new TaskCommand() { @Override public void run() { ITaskParam param = getTaskParam(); Log.e(TAG, getName() + " start, param1:" + param.get("param1") + ", chainName:" + param.get("chainName")); param.put("param1", 200); param.put("param3", "this is param3!"); }}, taskParam);engine.addTask(taskStep) .addTask(XTask.getTask(new TaskCommand() { @Override public void run() { ITaskParam param = getTaskParam(); Log.e(TAG, getName() + " start, param1:" + param.get("param1") + ", param3:" + param.get("param3")); param.put("param2", false); } }));// 4.设置工作链执行回调(可选)ICanceller canceller = engine.setTaskChainCallback(new TaskChainCallbackAdapter() { @Override public void onTaskChainCompleted(@NonNull ITaskChainEngine engine, @NonNull ITaskResult result) { Log.e(TAG, "task chain completed, thread:" + Thread.currentThread().getName()); Map<String, Object> data = result.getDataStore().getData(); for (Map.Entry<String, Object> entry : data.entrySet()) { Log.e(TAG, "key:" + entry.getKey() + ", value:" + entry.getValue()); } }// 5.工作链执行(必须)}).start();1.创立一条工作链.(必须)
...