协程在安卓中,用来处理即时任务,相对于那些延迟任务,使用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吧,