记录Kotlin高级部分
findViewById扩展
Kotlin可以使用java一样的findViewById,但扩展了更方便的形式如下:1
2
3
4
5
6
7
8
9
10
11
12//导入指定布局文件中所有控件属性
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//直接使用控件id访问控件属性
textview.text = "ABC";
}
}
泛型out 和 in
out 相当于java里面的 <? extend>,表示该参数只用来输出,不用来输入,你只能读我不能写我
in 相当于java里面的 <? super>,表示该参数只用来输入,不用来输出,你只能写我不能读我
举个栗子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Producer<T> {
fun produce(): T {
...
}
}
val producer: Producer<out TextView> = Producer<Button>()
val textView: TextView = producer.produce() // 相当于 'List' 的 `get`
class Consumer<T> {
fun consume(t: T) {
...
}
}
val consumer: Consumer<in Button> = Consumer<TextView>()
consumer.consume(Button(context)) // 相当于 'List' 的 'add'
协程
Kotlin的协程即上层多线程API,大大方便开发者使用多线程,实现自动创建多线程、切换线程
使用方法:
项目根目录下的 build.gradle :
1
2
3
4
5buildscript {
...
ext.kotlin_coroutines = '1.3.1'//定义所导入的协程版本
...
}Module 下的 build.gradle :
1
2
3
4
5
6
7
8dependencies {
...
//依赖协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines"
//依赖当前平台所对应的平台库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines"
...
}
代码部分:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.transsion.kotlinfirst
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.*
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//使用CoroutineScope
CoroutineScope(Dispatchers.Main).launch {//在 UI 线程开始
val image = getImage() // 使用suspend关键字声明挂起函数,自动运行在IO线程
avatarIv.setImageDrawable(image) //回到 UI 线程更新 UI
}
}
suspend fun getImage() = withContext(Dispatchers.IO) { //挂起函数声明运行在IO线程
delay(3000) //模拟耗时
return@withContext getDrawable(R.mipmap.ic_launcher)
}
}
其中Dispatchers为协程提供作用域,有以下作用域
- Dispatcher.Main 运行在主线程中
- Dispatcher.IO 运行在IO线程中,适用于IO操作
- Dispatchers.Default:适合 CPU 密集型的任务,比如计算
下面是CoroutineScope API地址