Kotlin 学习总结

一: 协程
1. 在安卓中,协程很好的解决了两个问题:
耗时任务,运行时间过长阻塞主线程
主线程安全,允许你在主线程中调用任意 suspend(挂起) 函数

  1. 除了 invoke(or call) 和 return ,它额外添加了 suspend(挂起) 和 resume(恢复)。

  2. 在 Android 中,我们使用结构化并发可以做三件事:
    取消不再需要的任务
    追踪所有正在进行的任务
    协程失败时的错误信号

  3. 启动协程有两种方法,且有不同的用法:
    使用 launch 协程构建器启动一个新的协程,这个协程是没返回值的
    使用 async 协程构建器启动一个新的协程,它允许你返回一个结果,通过挂起函数 await 来获取。

  4. coroutineScope 和 supervisorScope。它们之间最大的不同就是,当其中任意一个子协程失败时,coroutineScope 会取消。所以,如果一个网络请求失败了,其他的所有请求都会立刻被取消。如果你想继续执行其他请求的话,你可以使用 supervisorScope,当一个子协程失败时,它不会取消其他的子协程。

  5. 一次性请求 : 调用一次执行一次,它们总是在结果准备好之后才结束执行。
    流式请求 : 观察变化并反馈给调用者,它们直到第一个结果返回才会结束执行。、

二: Kotlin和Java的部分区别

Kotlin关键字与操作符 :

https://blog.csdn.net/xfhy_/article/details/79153251

UU的代码:

https://github.com/sanhuai001/AndroidSDK-master

1. 三元表达式

java:

a > b ? a : b

kotlin:

if(a >b) a else b

2. Fragment里面获取控件的id

java:

直接findViewById() 或者 ButterKnif(注解)初始化

Kotlin:

viewType?.tv_title?.text = resources.getString("课程")

3. ?.let

[图片上传失败...(image-f03b02-1596013235256)]

let : it 判空,返回值为函数块的最后一行或指定return表达式

with: 无it 不判空, 返回的是最后一行或指定return表达式

run : 无it 判空, 返回的是最后一行

apply: 返回的是对象本身

also:返回的则是传入对象的本身

[图片上传失败...(image-b23100-1596013235256)]

4. Operator call corresponds to a dot-qualified call ‘adapter?.getItemCount().compareTo(0)’ which is not allowed on a nullable receiver ‘adapter?.getItemCount()’

使用 A ?: B 表达式,?: 表示的意思是,当对象 A 值为 null 的时候,那么它就会返回后面的对象 B。

[图片上传失败...(image-e2f6fc-1596013235256)]

5. Kotlin比Java代码少,少在哪里?

6. !! 尽量不用、少用该操作符 (同4)

报错:

[图片上传失败...(image-47aadd-1596013235256)]

解决办法(同7):

[图片上传失败...(image-5eb099-1596013235256)]

7. Elvis 运算符 ?:

[图片上传失败...(image-5da080-1596013235256)]

如果是整形:

var pos = 10

if(pos?.toInt() ?: 0) {

}

8. EditText 赋值方法

editText.text=“文本内容”,会报错

解决方法如下:

一:editText.setText(“文本内容”)

二: editText.text=Editable.Factory.getInstance().newEditable("文本内容")

9. List 无法直接clear()

定义:MutableList 而不是List, MutableList 是有get和set的,故可以clear()

10. 点击事件??--如何减少代码行数 ?

11. 一个类里面有多个layout, 里面有重名的id,报错: Overload resolution ambiguity. All these functions match

12. 使用List的方法

get:带operator修饰的方法,因此可用"[]"运算符访问集合元素。

indexOf:返回集合元素在List中的索引。

lastIndexOf:返回集合元素在List中最后一次的出现位置。

subList:返回List集合的子集合。

//创建不可变集合,返回值是List var list1 = listOf("Java", "Kotlin", null, "Go") for (i in list1.indices) { println(list1[i]) } //获取指定元素的出现位置 println(list1.indexOf("Kotlin")) //获取List的子集合 println(list1.subList(1, 3))

输出结果:

Java Kotlin null Go 1 [Kotlin, null]

13. const

const : 将属性标记为编译期常量

[图片上传失败...(image-3389b1-1596013235256)]

14. Kotlin

Thread Handler

15. 协程Coroutine 挂起 : 读写文件或者网络请求

尽管协程本身是轻量级的,但是协程做的工作一般比较重,比如读写文件或者网络请求

在一个线程上可以同时跑多个协程,同一时间只有一个协程被执行,在单线程上模拟多线程并发,协程何时运行,何时暂停,都是有程序员自己决定的

runBlocking所在协程被挂起后会阻塞所在线程,线程不能处理协程之外的事情;coroutineScope所在的协程被挂起后,则会立即交出控制权给所在的线程,不会阻塞线程,线程可以处理协程之外的事情

suspend关键字,这个关键字翻译过来就是“挂起”的意思,suspend关键字修饰的函数也就叫“挂起函数”

挂起函数必须在协程或者其他挂起函数中被调用,换句话说就是挂起函数必须直接或者间接地在协程中执行。

你可能感兴趣的:(Kotlin 学习总结)