任务链设计与思考

511 阅读1分钟

任务假设

假设现在有这样的需求,有一系列的初始化任务。A 任务初始化是最基础的初始化任务,B,C ... 后面的初始化任务都依赖上个任务的成功结果,直到最后一个任务完成。中间需要每个任务和全部任务结束的状态反馈。

初版实现

抽象层

public abstract class TaskChain {

  public static final String TAG = TaskChain.class.getSimpleName();

  public static TaskStatusListener taskStatusListener;

  private TaskChain next;

  public TaskChain(TaskChain next) {
    this.next = next;
  }

  public abstract boolean handlerTask();

  public void doNext() {
    if (handlerTask() && next != null) {
      if (taskStatusListener != null) {
        taskStatusListener.currentTaskCompleted(this);
      }
      next.doNext();
    } else {
      if (next == null && handlerTask()) {
        if (taskStatusListener != null) {
          taskStatusListener.allCompleted();
        }
      } else {
        if (taskStatusListener != null) {
          taskStatusListener.currentTaskFail(this);
        }
      }
    }
  }

  public interface TaskStatusListener {

    void allCompleted();

    void currentTaskFail(TaskChain taskChain);

    void currentTaskCompleted(TaskChain taskChain);
  }

  @CheckResult
  public TaskChain setTaskStatusListener(TaskStatusListener listener) {
    taskStatusListener = listener;
    return this;
  }

  public TaskChain release() {
    taskStatusListener = null;
    return this;
  }
}

实现

public class Task1 extends TaskChain {

  public Task1(TaskChain next) {
    super(next);
  }

  @Override
  public boolean handlerTask() {
    try {
      Thread.sleep(200); //模拟任务耗时
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return true;
  }
}

public class Task2 extends TaskChain {

  public Task2(TaskChain next) {
    super(next);
  }

  @Override
  public boolean handlerTask() {
    try {
      Thread.sleep(200);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return true;
  }
}
public class Task3 extends TaskChain {

  public Task3(TaskChain next) {
    super(next);
  }

  @Override
  public boolean handlerTask() {
    try {
      Thread.sleep(200);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return true;
  }
}

调用

new Task1(new Task2(new Task3(null))).setTaskStatusListener(
    new TaskStatusListener() {
      @Override
      public void allCompleted() {
        Log.e(TaskChain.TAG,"全部任务完成");
       
      }

      @Override
      public void currentTaskFail(TaskChain taskChain) {
        Log.e(TaskChain.TAG,"子任务失败,任务中断 :" + taskChain.toString());
      }

      @Override
      public void currentTaskCompleted(TaskChain taskChain) {
        Log.e(TaskChain.TAG,"子任务成功,任务继续 :" + taskChain.toString());
      }
    }).doNext();

缺陷

我想像 RxJava 一样,当前任务除了能告诉下一个任务成功和失败以外,还想传递当前任务的处理结果给下一个任务使用,但是不希望是直接是个 Object 传递给下个任务还需要下面的任务去做类型判断强转, 目前在代码的抽象设计(或者泛型设计)这块上有些阻塞,期望大佬多多指教!