본문 바로가기

프로그래밍 놀이터/Kotlin50

Coroutine 과 놀아보기 #2 Coroutine 과 놀아보기 #2 - Coroutine 과 놀아보기 #1 과 마찬가지로 공부를 하면서 의아스러운 부분들을 테스트 코드를 통해 검증하며 정리한 글입니다.Coroutine 과 놀아보기 #1 - Job 이 cancel 되었을 때는 CancellationException 이 발생한다. 하지만, 이는 정상 동작으로 간주하여 coroutine 내에서는 crash 가 나진 않는다. ( runBlocking 안에서는 crash 가 난다.. runBlocking 은 따로 공부할 필요가 있다. ) - withTimeout 의 경우는 일단 synchronous 한 동작을 한다. (withContext 와 비슷하다.) 아래와 같은 코드가 있다면 어떤 로그도 찍히지 않는다. withTimeout(1000L){.. 2019. 5. 23.
Coroutine 과 놀아보기 #1 Coroutine 과 놀아보기 #1 - android studio 에서 coroutine 관련된 것들을 인식 못한다. android 3.2.1 버전으로 업그레이드 하니 해결되었다. 해당 버전 이상으로 환경 세팅을 하고 시작하자! - 이 글은 내가 coroutine 을 학습한 후에 약간 까리한 부분들을, 테스트 코드를 짜서 실험한 결과를 공유하는 글이다. runBlocking? 새로운 coroutine 을 수행하며, 작업이 끝날 때까지 현재 thread 를 block 시킨다. (interrupt 가능하다.) - 다음과 같은 테스트를 해보았다. btn.setOnClickListener{ runBlocking{ startLogPrinting() // mainHandler 에서 50ms 마다 “logPrinti.. 2019. 5. 22.
Coroutine first launch slow.. Coroutine first launch slow.. -android coroutine 1.1.1 기준 각 dispatcher 당 처음 launch 에 대해 매우 느린 현상이 있다. 예를 들어 GlobalScope.launch(Dispatchers.Main){ } 으로 코드를 실행시킬 경우 300ms 정도 이상이 걸리곤 한다.이는 first launch 에만 해당하며, 이후에는 process kill 되기 전까지는 0~1ms 의 속도를 낸다. -이는 각 dispatcher 별 첫 launch 에 모두 해당하며, Main 이 특히 오래 걸리고, 하나의 trial 이 다른 dispatcher 의 first launch 에 긍정적 영향은 미치지만, 그래도 여전히 오래 걸리는 이슈가 있다. -https://gi.. 2019. 4. 26.
[coroutine] java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android' [coroutine] java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotlinx-coroutines-android' -coroutine 을 사용한 project 에서 release build (minify 포함) 을 하면 아래와 같은 exception 이 발생하며 crash 가 발생한다.java.lang.IllegalStateException: Module with the Main dispatcher is missing. Add dependency providing the Main dispatcher, e.g. 'kotl.. 2019. 3. 6.
[coroutine] exception 을 이해해보자 #2 ( in global scope ) [coroutine] exception 을 이해해보자 #2 ( in global scope ) -[coroutine] exception 을 이해해보자 #1 ( in my coroutine scope ) 과 동일한 sample 들을 직접 생성한 coroutine 이 아닌 GlobalScope 에서 수행해보기로 했다.혹시나 뭔가 동작이 다를까 해서..내가 알고 있기로는 GlobalScope 은 defaultHandler 가 setting 되어 결국 모든 exception 을 먹어 crash 가 나지 않는다는 차이만 있는것으로 알고 있는데.. 검증해보자 ( 결론은 잘못 알고 있었다. ) -class MainActivity : Activity() { override fun onCreate(savedInstanc.. 2019. 3. 6.
[coroutine] exception 을 이해해보자 #1 ( in my coroutine scope ) [coroutine] exception 을 이해해보자 #1 ( in my coroutine scope ) -이 글은 coroutine exception 에 대한 일종의 심화과정이라고 볼 수 있다.기본 exception 에 대한 내용을 먼저 이해한 후 이곳의 글을 보자![coroutine] Exception handling -class MainActivity : Activity() { private val coroutineScope = CoroutineScope(Dispatchers.Main) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity.. 2019. 3. 5.
[coroutine] Exception handling [coroutine] Exception handling https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/exception-handling.md#exception-handling Exception propagation- Coroutine builder 는 2가지 flavor 가 있다. exception 을 자동으로 전파하는 launch 와 actor류, 그리고 user 에게 노출되는(돼왕: api call 을 통해 결과를 얻어갈 수 있는) async 와 produce 류. 자동 전파하는 케이스는 Java 의 uncaughtExceptionHandler 와 비슷하게 unhandled exception 이다. (돼왕: 유저에게 전파되지 않는다.) .. 2019. 3. 4.
[Coroutine] Coroutine context and dispatchers [Coroutine] Coroutine context and dispatchers https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/coroutine-context-and-dispatchers.md#thread-local-data -기존에 있었던 doc 이 update 되어서 따로 정리한다. Coroutine context and dispatchers -Coroutine 은 항상 어떤 context 하에서 실행된다.이 context 는 CoroutineContext type 을 가지며 Kotlin standard lib 에 정의되어 있다. -Coroutine context 는 여러개의 element 들을 가진 set 이다.main element.. 2019. 2. 8.
[android] AsyncTask 를 Coroutine 으로 바꿔본 후기 AsyncTask 를 Coroutine 으로 바꿔본 후기 -일반적으로 잘 사용하는 아래의 패턴은 꽤 나이스하게 바뀐다. onPreExecute 에서 progressdoInBackground 에서 bg jobonPostExecute 에서 progress 닫고 UI 작업 -// AsyncTask object : AsyncTask() { override fun onPreExecute() { showProgress(R.string.loading) } override fun doInBackground(vararg params: Void): List { return getMyAccountItemList(); } override fun onPostExecute(result: List) { if (isFinishing.. 2019. 2. 7.