android: 一种按顺序串行执行任务的解决方案
在app开发过程中很多时候会遇到这样一种需要串行执行的需求,比如直播间送礼物,可能短时间内送来了很多的礼物,app需要根据送来的礼物的顺序依次播放礼物的动画,也就是需要在上一个动画播放完成后,继续播放下一个动画。
解决这个问题的思路如下:
1, 使用队列串行的特性,用来存储进来的任务,这里使用到了非阻塞队列ArrayDeque;
2, 利用线程池执行具体的任务;
3, 通过线程池的回调接口,传递给app业务层;
4, app业务层处理完成任务后,通知队列去执行下一个任务;
接下来我们通过代码具体看一下实现的细节:
1, 设置一个队列:
private ArrayDeque<BaseSyncTask> pendingQueue = new ArrayDeque<>();
2, 任务入队,并且开始执行:
这是一个任务,
public abstract class BaseSyncTask implements SyncTask {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public interface SyncTask {
void doTask();
}
任务入队,
public void enqueue(final BaseSyncTask task) {
task.setId(count.getAndIncrement());
System.out.println("[OneByOne]The task id = :" + task.getId());
pendingQueue.offer(task);//the ArrayDeque should not be blocked when operate offer
System.out.println("[OneByOne]The pendingQueue size = :" + pendingQueue.size());
if (currentTask == null) {
coreExecute();
}
}
任务执行,
private void coreExecute() {
currentTask = pendingQueue.poll();
if (currentTask != null) {
System.out.println("[OneByOne]executing currentTask id = :" + currentTask.getId());
TinyTaskExecutor.execute(new AdvancedTask() {
@Override
public Object doInBackground() {
System.out.println("[OneByOne]doInBackground, " + "the current thread id = " + Thread.currentThread().getId());
return null;
}
@Override
public void onSuccess(Object o) {
currentTask.doTask();
}
@Override
public void onFail(Throwable throwable) {
}
});
}
}
3, 回调接口,给业务层使用:
final BaseSyncTask task = new BaseSyncTask() {
@Override
public void doTask() {
valueAnimator4.start();
}
};
TinySyncExecutor.getInstance().enqueue(task);
4, 业务层处理完毕,通知队列:
TinySyncExecutor.getInstance().finish();
public void finish() {
System.out.println("[OneByOne]finish task, task id = " + currentTask.getId() + "; pendingQueue size = " + pendingQueue.size());
coreExecute();
}