在Android开发时,我们经常会有这样的业务需求,需要多个任务串联起来,做完一个在进行下一个。如果我们直接通过一般办法去写的话,代码会很乱,写起来也会很麻烦。
那么由此LinkTask就诞生了,它能把多个任务串联起来,按顺序执行。并且能把上一个任务执行完成得到的结果传给下一个任务,调用next.next("传给下一个任务的参数"); 开始执行下一个任务。
使用代码如下:
LinkTask linkTask = new LinkTask();
linkTask.start(new LinkTask.Task() {
@Override
public void task(final LinkTask.Next next, final Object obj) {
//同步任务
Log.i("LinkTask", "任务一开始");
List<Integer> list=new ArrayList<>();
for (int i = 0; i <100 ; i++) {
list.add(i);
}
Log.i("LinkTask", "任务一做完了");
next.next(list.size());
}
}).next(new LinkTask.Task() {
@Override
public void task(final LinkTask.Next next, final Object obj) {
//异步任务
new Thread(new Runnable() {
@Override
public void run() {
Log.i("LinkTask", "任务二开始,参数:" + obj.toString());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("LinkTask", "任务二做完了");
next.next("22222");
}
}).start();
}
});
LinkTask库也很简单就一个类,如下:
package android.com.linktasklib;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.util.LinkedList;
import java.util.Queue;
/**
* ================================================
* 作 者:轻风
* 版 本:1.0
* 创建日期:2017/8/24 11:34
* 描 述:任务链(完成一个任务,再一下一个任务)
* 优点:解决迷之缩进问题,让一套逻辑看起来更清晰
* Q Q:2319118797
* ================================================
*/
public class LinkTask {
//队列保存每一个任务
Queue<Task> queue=new LinkedList<>();
//handler用来回到主线程
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Task task=queue.poll();
if(task!=null){
task.task(new Next() {
@Override
public void next(Object obj) {
Message msg=new Message();
msg.obj=obj;
handler.sendMessage(msg);
}
},msg.obj);
}else {
Log.i("LinkTask","所有任务结束了");
}
}
};
/**
* 任务开始
* @param task
* @return
*/
public LinkTask start(Task task){
task.task(new Next() {
@Override
public void next(Object obj) {
Message msg=new Message();
msg.obj=obj;
handler.sendMessage(msg);
}
},"");
return this;
}
/**
* 下一个任务
* @param task
* @return
*/
public LinkTask next(Task task){
queue.offer(task);
return this;
}
public interface Task {
/**
* 里边执行一个任务
* @param next 下一个任务的引用
* @param obj 上一个任务的结果
*/
void task(Next next, Object obj);
}
public interface Next {
/**
* 开始一下一个任务
* @param obj 下一个任务所需参数
*/
void next(Object obj);
}
}
希望能对大家有所帮助。
网友评论