链式异步任务类,解决迷之缩进

做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);
	}
	
}


感觉应该是能跑起来的,但是有一点不明确的是,在执行activity.runOnUiThread(task)之后是否会直接进入下一轮循环,如果有高手请指正。


具体用法应该能看明白,写点伪代码简单表示一下


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()等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值