基础
tips:
1.浮点型类型kotlin会自动推测为double的的类型,如果在数据后面添加"f"或"F",那么会被定义为float类型;
2.关于float类型,编译器默认保存小数点后6位(float类型转十进制是6位)的精确度,超出的部分会被丢弃掉,从而会精度损失;(数据精度丢失标准:四舍五入)
3.kotlin中,数组类型不属于集合;
4.数组遍历时不同于java的一种遍历方式
for((index,item) in arrayarg.withIndex()){
println("$index-$item")
//打印结果 index->item :(当前下标->数组中当前下标的取值)
}
5.in和out的关键字使用
out关键字:
含义:表示泛型类型的上限
使用:可以在使用出直接添加,也可以在定义出添加(两者选其一即可)
功能:那么被允许传入的参数就是该类型本身和该类型的子类型
in关键字:
含义:表示泛型类型的下限
使用:可以在使用出直接添加,也可以在定义出添加(两者选其一即可)
功能:那么被允许传入的参数就是该类型自身和该类型的父类型
6.扩展函数
fun main(){
//正常的调用
Jump().test()
//扩展函数的调用
Jump().doublleJump()
}
--------------------以上是Kotlin的调用----------------------------------
class Jump{
fun test(){
println("test")
}
}
//对于Jump类扩展的方法
fun Jump.doubleJump():String{
return "doubleJump"
}
----------------------以下是在JAVA类中的调用-----------------------
KTExtentionsKT.doubleJump(new Jump())
协程
协程是什么?协程不属于标准库,所以在调用时,需要引入包
协程:由kotlin官方提供的线程Api
协程的好处?非阻塞式挂起
协程可以自动切换线程 ,避免了回调地狱,消除了回调
两个接口请求,然后等待两个结果获取成功之后,然后将两个结果合并执行下一步
协程的处理方案:
1.执行第一个接口请求
2.执行第二个接口请求
3.合并两次的接口请求结果,用方法合并 suspendingMerge("第一个接口的请求结果","第二个接口的请求结果"),返回接口为两次请求结果的合并
suspend:指该协程所在的线程从该行代码开始不再运行该协程了,运行结束了,待挂起的函数执行完成后,会在指定的线程中(Dispatcher.IO等)继续执行接下来的协程内容,待执行完成后,会将线程切回到原来的线程,当然也可以通过代码设置不再切回去
resume:协程切回来的动作
挂起函数必须直接或间接在协程里被调用(直接或间接的调用一个自带的挂起函数),否则没有设置挂起函数的意义
语法上来讲,suspend自身不具备任何切换协程的含义,它仅仅是一个表示,是创建者为了警告调用者,该段需要执行的代码应该在协程里被调用,是个耗时操作
关于协程的使用:
使用范围:对于耗时操作,类似于java代码中的耗时操作,如,网络请求等,需要通过协程实现,否则,可能会导致主线程卡顿
实现代码,首先,需要给代码添加suspend的关键字,并且调用该函数的函数也应该是挂起函数,也就是说,挂起函数只可以被挂起函数调用,从而与上述挂起函数必须直接或间接的调用一个挂起函数相呼应,其次,需要用自带的一些挂起函数对代码内容进行包裹,比如:withContext、delay等
关于协程的非阻塞式挂起:
协程可以用同步的方式写出异步执行的代码,
协程涉及到的挂起,有点类似于计算机操作系统中的作业挂起,,当某作业被挂起时,其他正在执行的作业依旧会被执行,区别在于,操作系统中的挂起,属于需要被唤醒的操作,而协程自身的挂起,会在自己执行完成之后,自己再切回原来调用的线程中继续执行,具体的内容需要后续查看系统源码分析
以上,是通过一些学习视频编辑的一些自己关于协程的理解,也不清楚对不对,哈哈哈哈