협정(Coroutine-경량급 라인)의 사용
23369 단어 안드로이드 개발
android
와kotlin
중의 사용만 말한다.의존성 추가
// kotlin
ext.kotlin_version = '1.3.41'
// repository
jcenter()
//
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0-RC2'
GlobalScope.launch
fun main() {
GlobalScope.launch {
println(" ")
delay(1000)
println(" , ")
}
//
Thread.sleep(500)
println(" ")
}
출력: 나는 협동 주 라인에서 탈퇴했다
runBlocking
fun main() {
runBlocking {
launch {
println(" ")
delay(1000)
println(" ")
}
}
// runBlocking
Thread.sleep(500)
println(" ")
}
출력: 협정 시작 협정 종료 메인 라인 종료
suspend
fun main() {
runBlocking {
println(" ")
launch {
test()
}
println(" ")
}
}
suspend fun test() {
delay(1000L)
println(" suspend ")
}
출력: 시작과 끝 나는suspend 방법으로 인쇄했다
Job
fun main() {
runBlocking {
println(" ")
val job = launch {
delay(1000L)
println("in launch")
}
job.join()
println(" ")
}
}
출력:시작 in launch 끝
cancelAndJoin
Job.cancel은 사실상 이상을 던져서 실행을 중단합니다.
fun main() {
runBlocking {
println(" ")
val job = launch {
try {
var i = 1
while (isActive) {
print(i++)
delay(500L)
}
} finally {
println("
")
}
}
delay(1300L)
job.cancelAndJoin()// cancel , , delay
println(" ")
}
}
출력: 시작 123 이상 종료 종료 종료
withTimeout
Timeout
실제로도 이상을 던졌다.fun main() {
runBlocking {
println(" ")
try {
val result = withTimeout(1300) {
repeat(10) {
print(it)
delay(500)
}
" , Timeout"
}
println("
result=$result")
} catch (e: TimeoutCancellationException) {
println("
Timeout ")
}
}
}
출력: 012 Timeout 시작
Channel
Channel
는 BlockingQueue
에 해당한다fun main() {
runBlocking {
println(" ")
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
channel.close()
}
for (y in channel) print("$y ")
println("
")
}
}
출력: 시작 1 4 9 16 25 끝
async、await
fun main() {
runBlocking {
println(" ")
val d = async {
println("async start...")
delay(1000)
println("async end")
999
}
println("d=${d.await()}")
println(" ")
}
}
async
를 실행하지 않으려면 CoroutineStart.LAZY
를 추가하면 됩니다. 그리고 async
는 호출start
또는 await
을 기다려야 실행됩니다. 다음과 같습니다.fun main() {
runBlocking {
println(" ")
val d = async(start = CoroutineStart.LAZY) {
println("async start...")
delay(1000)
println("async end")
999
}
d.start()
println("d=${d.await()}")
println(" ")
}
}
출력: async start 시작...async end d=999 끝
실제 실행 스레드
fun main() {
runBlocking {
//
launch {
println("launch\t\t\t\t\t" + Thread.currentThread().name)
}
//
GlobalScope.launch {
println("GlobalScope.launch\t\t" + Thread.currentThread().name)
}
//
launch(Dispatchers.Default) {
println("Dispatchers.Default\t\t" + Thread.currentThread().name)
}
//
launch(Dispatchers.IO) {
println("Dispatchers.IO\t\t\t" + Thread.currentThread().name)
}
// , ,
launch(Dispatchers.Unconfined) {
println("Dispatchers.Unconfined\t" + Thread.currentThread().name)
}
// android main
// launch(Dispatchers.Main) {
// println("Dispatchers.Main\t\t" + Thread.currentThread().name)
// }
}
}
출력: GlobalScope.launch DefaultDispatcher-worker-1 Dispatchers.Default DefaultDispatcher-worker-3 Dispatchers.IO DefaultDispatcher-worker-3 Dispatchers.Unconfined main launch main
공식 문서
https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html https://github.com/Kotlin/kotlinx.coroutines
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Android] 둥글게 펼쳐지는 Ripple을, 바삭하게 구현간이적으로 터치 피드백이 없는 버튼이나 레이아웃, 탭 범위가 좁아져 버린 버튼 등에, 범위 밖으로 둥글게 퍼지는 Ripple로 탭감, 영역을 조금 늘립니다. 이런 느낌 (화질 나쁘고 미안해..) Ripple을 내고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.