做V层的小伙伴一直抱怨异步任务的各种回调和runOnUIThread造成了迷之缩进,写完代码只有上帝和自己知道啥意思,三天之后就只有上帝知道啥意思了……
听他说有个什么框架可以链式结构各种点出来,于是思考了一下这个模式,觉得不是很难实现,于是自己动手写了一个链式的异步任务,而且可以随时跳回UI线程,再跳回子线程,再跳回UI线程,再跳回子线程……咳咳,刚刚用记事本写出来的,不知道能不能跑,先贴上明天试验。
public class AsyncTask{
private String TAG = "AsyncTask";
private Thread thread;
private ArrayList<Task> tasks;
private MyRunnable mRunnable;
private Activity activity;
private ProgressListener listener;
private int taskCount;
private AsyncTask(Activity activity){
this.mRunnable = new MyRunnable();
this.tasks = new ArrayList<>();
this.activity = activity;
}
public static AsyncTask getInstance(Activity activity){
return new AsyncTask(activity);
}
public AsynoTask setProgressListener(ProgressListener listener){
this.listener = listener;
return this;
}
public AsynoTask doAsync(Task task){
this.tasks.add(task.setRunOnUiThread(fasle));
return this;
}
public AsyncTask doUI(Task task){
this.tasks.add(task.setRunOnUiThread(true));
return this;
}
public void start(){
this.thread = new Thread(runnable).start();
}
class MyRunnable implements Runnable{
@Override
public void run(){
taskCount = tasks.size();
for(int i = 0; i < taskCount; i++){
Task task = tasks.get(i);
if(task == null){
continue;
}
if(task.runOnUiThread && activity != null){
activity.runOnUiThread(task);
}else{
task.run();
}
if(listener != null){
listener.at(taskCount, i);
}
}
}
}
/**
* 任务类,实现Runnable接口,并带有线程标识
*/
public abstract class Task implements Runnable{
public boolean runOnUiThread;
Task setRunOnUiThread(boolean b){
this.runOnUiThread = b;
return this;
}
}
public interface ProgressListener{
void at(int taskCount, int done);
}
}
具体用法应该能看明白,写点伪代码简单表示一下
AsyncTask.getInstance(activity)
.setProgressListener(new ProgressListener(){
public void at(int taskCount, int done){
//do something
}
})
.doAsync(new Task(){
public void run(){
//do something
}
})
.doUI(new Task(){//省略})
.doAsync(new Task(){//省略})
.doUI(new Task(){//省略})
.start();
如果这个类能够正常跑起来的话,后期再完善其他状态监听的方法比如onAllTaskFinished()等