프로그래밍 검색 블로그

코틀린 비동기 async 본문

Android

코틀린 비동기 async

코딩조무사 2018. 2. 16. 19:41

코틀린 베타로 비동기 관련 Api 가 추가되었다

문법으로는 C#의 async/await의 코틀린식 구현이라고 볼수 있다 



베타를 비동기 Api를 사용하기 위해 그레들 설정부터 보자면

현재 코틀린 버전을 1.2.21 혹은 그 이상으로 맞춰준다 


1
ext.kotlin_version = '1.2.21'
cs



dependencies에 코루틴 api 를  추가한다

현재는 베타라서 필요하지만 미래에는 필요 없을수도 있다 

1
compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.2"
cs





1. 비동기 API 

async 는 비동기로 동작하고 블럭 안에 있는 것을 비동기로 수행한다

간단하게 textview 글자를 바꿔주는걸로 시작해본다 

launch 도 비슷한 기능을 수행하지만  코틀린 공식 홈페이지에 존재하지 않아서

앞으로 삭제될 가능성이 있어 적지 않았다 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
 
        async {
            //Thread.sleep
            Log.e(TAG,"before")
            delay(5000)
            //비동기라서 View.post 를 호출해서 구현해야 한다
            textView.post {
                textView.text = "call async"
            }
            Log.e(TAG,"after")
        }
    }
cs



2. 비동기 함수


직접 비동기 함수를 만들려고 한다면 바로 async를 반환하는 방법으로 만들수 있다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    fun calc() = async {
        delay(3000)
        val s = (1..1000).sum()
        return@async s
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
 
        async {
            val executeSum = calc()
            Log.e(TAG,"before")
            delay(5000)
            val sum = executeSum.await()
            textView.post {
                //비동기라서 View.post 를 호출해서 구현해야 한다
                textView.text = "call async" + sum
            }
            Log.e(TAG,"after")
        }
    }
cs

 

val executeSum = calc()이 호출된  후 before 로그가 찍히고

val sum에서 Int를 받은 후에 textView에 찍게 된다 



3. 동기적인 함수에서 비동기 호출 계산을 끝내기

계산 결과를 출력하기 위해서 동기적인 함수에서 비동기 작업들을 일괄적으로 끝내야 할 때가 있는데 

그때 함수의 앞에 suspend 키워드를 사용한다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    suspend fun calc() : Int{
        val c = async {
            delay(3000)
            val s = (1..1000).sum()
            return@async s
        }
        return c.await()
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
 
        async {
 
            Log.e(TAG,"before")
            delay(5000)
            val sum = calc()
            textView.post {
                //비동기라서 View.post 를 호출해서 구현해야 한다
                textView.text = "call async" + sum
            }
            Log.e(TAG,"after")
        }
    }
cs







Comments