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异步库的更多相关文章

  1. 腾讯出品的一个超棒的 Android UI 库

    腾讯出品的一个超棒的 Android UI 库 相信做 Android 久了大家都会有种体会,那就是 Android 开发相对于前端开发来说统一的 UI 开源库比较少.造成这种现象的原因一方面是大多数 ...

  2. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  3. Tesseract.js 一个几乎能识别出图片中所有语言的JS库

    Tesseract.js 一个几乎能识别出图片中所有语言的JS库. 官网:http://tesseract.projectnaptha.com/ git:https://github.com/napt ...

  4. 一个PHP高性能、多并发、restful的工具库(基于multi_curl)

    This is high performance curl wrapper written in pure PHP. It's compatible with PHP 5.4+ and HHVM. N ...

  5. 实现一个带有指纹加密功能的笔记本(Android)第二部分

    上文基本完成了整个笔记本的笔记功能的实现,接下来记录实现指纹识别加密以及一些小注意事项. 首先判断该手机是否具备指纹识别的硬件功能和用户是否开启指纹识别. public boolean isFinge ...

  6. 在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】

    转自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml 另外dl_iterate_phdr可以查到当前进程所装在的所有 ...

  7. JSPatch库, 一个Apple官方支持的实现在线更新iOS应用的库

    简介 项目主页: https://github.com/bang590/JSPatch 示例下载: https://github.com/ios122/ios122 JSPatch 可以让你用 Jav ...

  8. 一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题

    现象 今天在做一个项目时, 将 tomcat 的 maxThreads 加大, 加到了 1024, tomcat 提供的服务主要是做一些运算, 然后插入 redis, 查询 redis, 最后将任务返 ...

  9. 我的第一个Android开源库——CirclePointMove中文文档(可随Viewpager移动的指示器)

    Github网址:https://github.com/Stars-One/CirclePointMove 这个开源库一个封装好的Viewpager指示器,之前在学习的时候,想要实现一个小圆点跟随Vi ...

随机推荐

  1. 重新回顾JSP

    由于个人喜好,觉得自己需要学习一下,服务端的语言.JSP之前学过,不够许久未用了. http://www.w3cschool.cc/jsp/jsp-intro.html 1.Java代码片段使用< ...

  2. jQuery删除DOM节点

    jQuery删除DOM节点 <%@ page language="java" import="java.util.*" pageEncoding=&quo ...

  3. eclipse xml自动提示

    找到所需要的dtd文件: window->preferences->xml->xml catalog : public id 输入对应的字符串:

  4. V8编程入门

    本文档介绍了V8引擎的一些关键概念,并提供了例子hello world指引你入门. Hello World 让我们看一个Hello World的示例,它将一个字符串参数作为JavaScript语句,执 ...

  5. secureCRT自动化脚本

    http://cysnow.iteye.com/blog/1698791 cd \crt "C:\Program Files\VanDyke Software\Clients\SecureC ...

  6. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  7. eclipse中的Java项目导出成为一个可以直接双击运行的jar文件

    1. 选择要到处JAR文件的工程,右键选择“Export” 2. 选择“Java-->Runnable JAR file”,点击“Next”: 3. 在“Launch configuration ...

  8. Wireshark网络抓包(二)——过滤器

    一.捕获过滤器 选中捕获选项后,就会弹出下面这个框,在红色输入框中就可以编写过滤规则. 1)捕获单个IP地址 2)捕获IP地址范围 3)捕获广播或多播地址 4)捕获MAC地址 5)捕获所有端口号 6) ...

  9. W3Cschool学习笔记——HTML基础教程

    什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...

  10. FindPkgConfig----CMake的pkg-config模块

    FindPkgConfig A pkg-config module for CMake. CMake的pkg-config模块. Finds the pkg-config executable and ...