一个好用的几乎没有Callback的Android异步库
android-async-task
这是一个Android平台处理复杂异步任务的库
github传送门: https://github.com/gplibs/android-async-task
1. 安装方法
gradle:
dependencies {
compile 'com.gplibs:task:1.0.0'
}
Application onCreate:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
TaskProxy.init(getApplicationContext());
}
}
2. 一个简单例子

如图 Task1, Task2, Task3 为一组,按先后顺序执行, 其中Task2在主线程执行, Task1, Task3在后台线程执行。
Task4, Task5 为二组,按先后顺序执行,都在后台线程执行。
一组和二组同时启动,都执行完成后,开始Task6(Task6在主线程执行)。
以下是使用该库实现上面过程的代码:
TasksSample:
public class TasksSample extends TaskProxy<TasksSample> {
@TaskGroup(1)
protected Task<Void> task1() {
Log.d("TASK", "Task1 begin - isUIThread:" + isUIThread());
sleep(1000);
Log.d("TASK", "Task1 end");
return VoidTask();
}
@UIThread
@TaskGroup(1)
protected Task<Void> task2() {
Log.d("TASK", "Task2 begin - isUIThread:" + isUIThread());
sleep(1000);
Log.d("TASK", "Task2 end");
return VoidTask();
}
@TaskGroup(1)
protected Task<Void> task3() {
Log.d("TASK", "Task3 begin - isUIThread:" + isUIThread());
sleep(1000);
Log.d("TASK", "Task3 end");
return VoidTask();
}
@TaskGroup(2)
protected Task<Void> task4() {
Log.d("TASK", "Task4 begin - isUIThread:" + isUIThread());
sleep(500);
Log.d("TASK", "Task4 end");
return VoidTask();
}
@TaskGroup(2)
protected Task<Void> task5() {
Log.d("TASK", "Task5 begin - isUIThread:" + isUIThread());
sleep(2500);
Log.d("TASK", "Task5 end");
return VoidTask();
}
@UIThread
protected Task<Void> task6() {
Log.d("TASK", "Task6 begin - isUIThread:" + isUIThread());
sleep(100);
Log.d("TASK", "Task6 end");
return VoidTask();
}
public Task<Void> doTasks() {
Log.d("TASK", "TasksSample tasks begin");
TaskFactory.startSync(
getProxy().task1(),
getProxy().task2(),
getProxy().task3(),
getProxy().task4(),
getProxy().task5()
);
getProxy().task6().startSync();
Log.d("TASK", "TasksSample tasks end");
return VoidTask();
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean isUIThread() {
return Thread.currentThread().getId() == Looper.getMainLooper().getThread().getId();
}
}
调用 TasksSample:
public class TasksActivity extends AppCompatActivity {
TasksSample mSample = new TasksSample();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tasks);
test();
}
private void test() {
Log.d("TASK", "Activity test begin");
mSample.getProxy().doTasks().startAsync(new TaskCallback<Task<Void>>() {
@Override
public void run(Task<Void> task) {
Log.d("TASK", "doTasks callback");
}
});
Log.d("TASK", "Activity test end");
}
}
运行结果:

如上 书写起来非常简洁方便;
@TaskGroup 给任务分组, @UIThread 标识在主线程执行;
多个分组的任务直接丢进 TaskFactory 内部自动根据注解执行(同一组的任务按放进的先后顺序执行)。
3. 有返回值的任务
ResultTaskSample:
public class ResultTaskSample extends TaskProxy<ResultTaskSample> {
public Task<String> resultTask() {
sleep(1000);
return Task("string result");
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
调用 ResultTaskSample:
ResultTaskSample sample = new ResultTaskSample();
...
// 同步调用(会阻塞调用线程)
Task<String> task = sample.getProxy().resultTask().startSync();
String result = task.getResult();
Log.d("TASK", "result is:" + result);
...
// 异步调用
sample.getProxy().resultTask().startAsync(new TaskCallback<Task<String>>() {
@Override
public void run(Task<String> task) {
String result = task.getResult();
Log.d("TASK", "result is:" + result);
}
});
4. 处理任务中发生的异常
ResultTaskSample sample = new ResultTaskSample();
...
// 同步调用(会阻塞调用线程)
Task<String> task = sample.getProxy().resultTask().startSync();
if (task.isSuccess()) {
String result = task.getResult();
Log.d("TASK", "result is:" + result);
} else {
// 打印异常信息
task.getThrowable().printStackTrace();
}
...
// 异步调用
sample.getProxy().resultTask().startAsync(new TaskCallback<Task<String>>() {
@Override
public void run(Task<String> task) {
if (task.isSuccess()) {
String result = task.getResult();
Log.d("TASK", "result is:" + result);
} else {
// 打印异常信息
task.getThrowable().printStackTrace();
}
}
});
5. 多任务事件
当用TaskFactory启动多个任务时, 可以通过 TaskEventListener 获知各 Task 的执行情况。
TaskEventSample:
public class TaskEventSample extends TaskProxy<TaskEventSample> {
protected Task<Void> task1() {
Log.d("TASK", "Task1 begin");
sleep(500);
Log.d("TASK", "Task1 end");
return VoidTask();
}
protected Task<Void> task2() {
Log.d("TASK", "Task2 begin");
sleep(1000);
Log.d("TASK", "Task2 end");
return VoidTask();
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
调用 TaskEventSample:
TaskEventSample sample = new TaskEventSample();
...
TaskEventListener listener = new TaskEventListener() {
@Override
public void onAllTaskCompleted() {
Log.d("TASK", "all task completed");
}
@Override
public void onTaskCompleted(Task<?> task) {
Log.d("TASK", "A task completed, tag is:" + task.getTag());
}
};
TaskFactory.startAsync(
listener,
sample.getProxy().task1().tag("1"),
sample.getProxy().task2().tag("2")
);
一个好用的几乎没有Callback的Android异步库的更多相关文章
- 腾讯出品的一个超棒的 Android UI 库
腾讯出品的一个超棒的 Android UI 库 相信做 Android 久了大家都会有种体会,那就是 Android 开发相对于前端开发来说统一的 UI 开源库比较少.造成这种现象的原因一方面是大多数 ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- Tesseract.js 一个几乎能识别出图片中所有语言的JS库
Tesseract.js 一个几乎能识别出图片中所有语言的JS库. 官网:http://tesseract.projectnaptha.com/ git:https://github.com/napt ...
- 一个PHP高性能、多并发、restful的工具库(基于multi_curl)
This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...
- 实现一个带有指纹加密功能的笔记本(Android)第二部分
上文基本完成了整个笔记本的笔记功能的实现,接下来记录实现指纹识别加密以及一些小注意事项. 首先判断该手机是否具备指纹识别的硬件功能和用户是否开启指纹识别. public boolean isFinge ...
- 在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】
转自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml 另外dl_iterate_phdr可以查到当前进程所装在的所有 ...
- JSPatch库, 一个Apple官方支持的实现在线更新iOS应用的库
简介 项目主页: https://github.com/bang590/JSPatch 示例下载: https://github.com/ios122/ios122 JSPatch 可以让你用 Jav ...
- 一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题
现象 今天在做一个项目时, 将 tomcat 的 maxThreads 加大, 加到了 1024, tomcat 提供的服务主要是做一些运算, 然后插入 redis, 查询 redis, 最后将任务返 ...
- 我的第一个Android开源库——CirclePointMove中文文档(可随Viewpager移动的指示器)
Github网址:https://github.com/Stars-One/CirclePointMove 这个开源库一个封装好的Viewpager指示器,之前在学习的时候,想要实现一个小圆点跟随Vi ...
随机推荐
- 如何从mysql中将数据导入到sqlserver
本文讨论如何把MySQL的数据库导入到SQL Server中,所以首先你需要把两种数据库都安装了,再进行以下步骤. 一.为 MySQL安装ODBC驱动 1. 下载MySQL ODBC Connecto ...
- 分享一个基于thrift的java-rpc框架
简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...
- KB奇遇记(6):搞笑的ERP项目团队
早在我们来之前,KB公司这边就已经组建了ERP项目组了,当时IT就只有一个人,属网管出身.而关键用户分两种类型:专职关键用户和兼职关键用户.专职关键用户组织结构上已经调动到信息部,常驻在项目组里工作, ...
- [CSS3] 学习笔记-CSS3盒子样式
1.盒子的类型 在CSS3中,使用display来定义盒子的类型,包括block,inline,inline-block类型.div元素和P元素,属于block类型,span元素和a元素,属于inli ...
- 特殊字符html,css转义大全
使用方法: 这些字符属于unicode字符集,所以,你的文档需要声明为UTF-8: 下面符号列表的后面有两列编号,它们并不太一样,第一列是用于html的,你需要在前面加上&#符号: 第二列可以 ...
- 三层——vb.net版
经过不懈的努力,我的vb.net 版的三层登陆终于实现了.下面将我的成果向大家展示一下. 原则 vb.net的三层登陆跟C#的三层登陆的思想是一样的都是将系统分层--U层只负责与用户 ...
- github在windows下的安装和基本使用
1.在win下安装github时花费的时间是非常长的,有时还会出现因各种原因安装不成功.离线包本地安装方便的解决了此问题.点击http://pan.baidu.com/s/1boGrNLP可下载,解压 ...
- PHP 中使用 Composer
在线安装版本: http://www.phpcomposer.com/ 这个是国内的composer网站 thinkphp5自带了composer.phar组件,如果没有安装,则需要进行安装 以下命令 ...
- LINQ查询表达式基础
LINQ,语言集成查询(Language Integrated Query)是一组用C#和Visual Basic语言的扩展. 对于编写查询的开发人员来说,LINQ 最明显的"语言集成&qu ...
- asp.net core mvc实现伪静态功能
在大型网站系统中,为了提高系统访问性能,往往会把一些不经常变得内容发布成静态页,比如商城的产品详情页,新闻详情页,这些信息一旦发布后,变化的频率不会很高,如果还采用动态输出的方式进行处理的话,肯定会给 ...