0%

Kotlin Professional Get Started

记录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
17
class 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
    5
    buildscript {
    ...
    ext.kotlin_coroutines = '1.3.1'//定义所导入的协程版本
    ...
    }
  • Module 下的 build.gradle :

    1
    2
    3
    4
    5
    6
    7
    8
    dependencies {
    ...
    //依赖协程核心库
    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
24
package 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地址

如果你觉得有用,可以请我喝杯茶