kotlin协程简单封装
简述
经过两天的学习历程,看遍了国内的经典博客,也看完了官方的文档。下面推荐大家阅读
好的文章:
开始使用Kotlin协程
官方:
kotlinx.coroutines
如果英文够好,推荐看官网的,例子比较全面。
计划
学习过后,为了更进一步,特地封装一些常用API,以便其他新手学习使用。接下来将完成下面一个个计划功能
1. 顺序执行 task1,task2
2. 并发执行 task1,task2
3. 等待执行 task2 需等待 task1执行完毕后执行
4. 延迟执行 task1 需要10秒之后执行
5. 心跳执行 异步任务按指定间隔执行 Task
6. 任务执行感知生命周期,可以跟随当前activity的生命周期结束而自动结束,并可以配置是否在重新打开activity时是否要重新执行
7. 任务执行可选主线程还是子线程
8. 任务执行可以选择 需要网络或者不需要网络
9. 任务执行可以选择网络制式4G 或者wifi下执行(5.0以上特性)
10.任务可以选择在充电时执行(5.0以上特性)
11. 任务执行可以随时取消,可以取消所有当前任务
目前框架已经做到前7项计划,后续将逐渐完善。
代码演示
1. 顺序执行代码
![](https://img.haomeiwen.com/i2413316/b9ead040020527cb.png)
效果
![](https://img.haomeiwen.com/i2413316/aa9d4b5802edd8dd.png)
2. 并发执行 并且分别延迟1秒,3秒
![](https://img.haomeiwen.com/i2413316/a4004a5cfbdc5bfe.png)
效果
![](https://img.haomeiwen.com/i2413316/7c43785578d25964.png)
3. 等待执行
![](https://img.haomeiwen.com/i2413316/764f9ca636d45b93.png)
效果
![](https://img.haomeiwen.com/i2413316/cb436b56c62b67ae.png)
4. 心跳
![](https://img.haomeiwen.com/i2413316/ec752849e21e7391.png)
效果
![](https://img.haomeiwen.com/i2413316/e1b6eb75c13c59f2.png)
5. Activity 生命周期感知
实现步骤:
(1)创建一个JobHolder,用于保存job属性
(2)扩展View,添加contextJob属性,从View的上下文中也就是JobHolder的实现类中拿到Job对象,再扩展View的onClick事件,在事件中创建协程,并将Job作为协程的上下文传入给该协程,就可以被job取消了
(3)让Activity实现JobHolder,负责创建Job对象,并在生命周期结束的时候结束掉Job
![](https://img.haomeiwen.com/i2413316/751d91d9ffdf634f.png)
![](https://img.haomeiwen.com/i2413316/8a65dcebdae64478.png)
![](https://img.haomeiwen.com/i2413316/b64bca0965df7be6.png)
6. 协程中切换到android UI 线程
思路:用handler实现,在协程中只需要将Handler作为协程的上下文,并获取主线程的looper就行了
代码实现:
![](https://img.haomeiwen.com/i2413316/86d57cff7e7afc53.png)
使用:给协程传入UI上下文即可
![](https://img.haomeiwen.com/i2413316/a55a891be9a71ca5.png)
总结
线程是进程的最小单位,那么协程是线程的最小单位,而且协程可以在不同线程中随意跳转,还有更高级的玩法,协程间的通信,协程间的选择,协程之间数据共享,后期再继续更新更高级的玩法。
在这特别声明一点: 协程之间同时操作一个变量的时候,也是要考虑并发对变量的影响的,这点跟多线程一样,解决办法也类似,但不会阻塞线程。总结优点很多,很值得去用。