안드로이드

일하며 배운 신기한 토막상식 정리

강한 맷돼지 2024. 2. 1. 10:53

1. as 캐스팅할때 as? 는 안전한 캐스팅이다.

as 캐스팅할때 as? 를 사용하면 캐스팅이 안될때 클래스 캐스트 익셉션이 아니라 null을 줘버린다.

-> 안전하게 코딩하기 좋음

 

2. callbackflow

플로우 잘 안쓰다보니 공부하다가도 잊어버리는데 그냥 플로우 공식문서 읽었을때 안나왔던것 같다.

콜백을 코루틴 싱글샷으로 바꾸는 suspendCancellableCoroutine 처럼 

콜백을 flow로 바꾸는거다 사용법은 인터넷에 많이 나와있고 흐음 예시코드는 내 비밀 일기장에 적어야지 흐흐흐흐

 

3.firstNotNullOfOrNull

어레이에 붙어있는 확장함수인데 함수 블록 입력해주는게 null을 return 하지않는 첫번째 요소를 반환한다.

만약 다 null이라면 null 반환 as? 와 궁합이 잘맞는다.

 

4.lifeCycleScope

뷰모델 스코프가 엄연히 있는데 이거 왜쓰는겨 했지만 굉장히 편리하고 귀한 친구였다.

생명주기 관련되어 작업할때는 굉장히 많은 방어코드를 동반하기도 하는데(물론 방어말고 원인을 찾아 해결 해야하겠지만)

아주 쌈뽕하게 생명주기 관련 방어를 할 수 있다. 프래그먼트같이 안드에서 낳은 괴물을 상대할때 잘활용하자.

 

5.CoroutineExceptionHandler가 동작하는 thread

CoroutineExceptionHandler가 동작하는 스레드는 랜덤하다고 한다.(보장되지 않음)

상황:

1. CoroutineExcpetionHandler가 붙어있는 scope의 dispatcher를 IO로 설정

2. Scope내에서 Exception 발생

3. CoroutineExcpetionHandler내에서 UI를 변경하는 코드가 있음

4. 마!!! 왜 워커쓰레드에서 UI 바꾸는데 안드로이드 화나서 오류 던짐 

 

예상: 

CoroutineExceptionHandler는 Main에서 돌거나 달려있는 Scope의 Dispatcher를 따라가지 않을까?

 

실제 동작실험: 

CoroutineExceptionHandler가 달려있는 Scope의 Dispatcher를 Main으로 변경하니 CoroutineExceptionHandler에서 UI 변경 정상 동작  -> 아마 Unconfined 처럼 동작하지 않을까? 싶은데 예상

 

구글링:

https://stackoverflow.com/questions/65437573/kotlin-coroutines-exception-handler-on-main-thread

대충 요약

코루틴 익셉션 핸들러는 임의의 쓰레드에서 불릴 수 있고

어느 쓰레드에서 불린다고 확정할 수 없다.

-> 즉 UI 만지려면 오류 안나기 위해 내부에서 메인 쓰레드에서 코드가 실행되도록 조치를 취해줘야함