协程笔记

协程在安卓中,用来处理即时任务,相对于那些延迟任务,使用Worker来处理。

Job

协程中的Job描述一个后台进行的任务,可以手动取消,感知自己的作用域;

Jobs 工作链之间可以构成父子关系,这样,会导致,当父节点取消时,同时会递归地取消子节点。 当子节点异常结束时,也会到导致父节点立刻去结束。 这些,父子之间的行为可以通过SupervisorJob来解决

Job实例创建的常见形式如下:

  • 直接使用 launch的协程构造器,
  • 使用CompleteJob的工厂方法,当任务结束时会回调complete()方法

概念上,Job也不产生结果,只有方法调用的副作用,关注结果的Job可以用其子类 Defferd

Job states

Job的状态由三个变量构成,isActive, isCompleted, isCanceled, 通过不同组合,可以形成不同的状态, 000表示刚创建出来 100表示进入激活状态 010表示完美结束了代码块 001表示正在取消,cancelling 011表示已取消,cancelled 这里,通常创建后就会进入active状态,不过也可以创建时指定Coroutine.Lazy,延迟激活,通过start/join方法启动 一个激活的协程会一直运行,下一个状态可能是代码执行完毕,complete,或执行失败,抛异常,或被取消

抛异常会导致进入cancelling状态,Job可以调用cancel方法立刻进入cancelling状态,不过若是作为父节点,也要得子节点完成。

完成一个协议,也可以调用它的complete方法,也会等到子协程完成再完成。注意到,completing状态只是内部状态,并不对外公开,再完成子协程前, 在外面观察者看到,当前协程还是active状态。

Cancellation cause

协程可以当出现异常时进入canceled状态。当子节点出现异常取消时,也会导致父节点取消。实现方式上,是通过抛异常来让让协程进入到cancelled状态的。 正常取消和异常取消区别于抛出的异常类型,正常取消抛出 CancellationException,其他类型异常则视为属于异常退出了。 有趣的是,这个异常是Java基础库一致的。

线程安全保证

实现类都是不稳定

指的是 JopSupport吧,