一: 协程
1. 在安卓中,协程很好的解决了两个问题:
耗时任务,运行时间过长阻塞主线程
主线程安全,允许你在主线程中调用任意 suspend(挂起) 函数
除了 invoke(or call) 和 return ,它额外添加了 suspend(挂起) 和 resume(恢复)。
在 Android 中,我们使用结构化并发可以做三件事:
取消不再需要的任务
追踪所有正在进行的任务
协程失败时的错误信号启动协程有两种方法,且有不同的用法:
使用 launch 协程构建器启动一个新的协程,这个协程是没返回值的
使用 async 协程构建器启动一个新的协程,它允许你返回一个结果,通过挂起函数 await 来获取。coroutineScope 和 supervisorScope。它们之间最大的不同就是,当其中任意一个子协程失败时,coroutineScope 会取消。所以,如果一个网络请求失败了,其他的所有请求都会立刻被取消。如果你想继续执行其他请求的话,你可以使用 supervisorScope,当一个子协程失败时,它不会取消其他的子协程。
一次性请求 : 调用一次执行一次,它们总是在结果准备好之后才结束执行。
流式请求 : 观察变化并反馈给调用者,它们直到第一个结果返回才会结束执行。、
二: 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
定义:MutableList
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关键字修饰的函数也就叫“挂起函数”
挂起函数必须在协程或者其他挂起函数中被调用,换句话说就是挂起函数必须直接或者间接地在协程中执行。