일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 27 | 28 |
- 회고
- 커스텀상태
- Kotlin
- kotlin강좌
- ReactiveProgramming
- 디자인패턴
- 알게되는
- 글또
- 안드로이드스튜디오
- 자바
- 알고리즘
- 병렬프로그래밍
- 코루틴
- 스레드
- theming
- android
- 코틀린
- Rxjava
- 테스트
- viewmodel
- Gradle
- k8s
- g 단위테스트
- 병럴프로그래밍
- 안드로이드강좌
- 책
- 안드로이드
- Compose
- mockito
- Coroutine
- Today
- Total
목록개발 (73)
선생님, 개발을 잘하고 싶어요.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTcLd4/btrnB8bCAMW/nLjGIvY1XzRHeDXkAk0buk/img.png)
에러는 어디서 처리하는가? 다음 코드는 getImage가 에러를 던진다면 어떻게 될까요? fun main() = runBlocking { try { val deferredImage = scope.async { getImage("path") } deferredImage.await() } catch (e: Exception) { // ignore all exceptions } } kotlin 문서를 참조하면 async 내부에서 에러가 발생하는 경우 await 시점에 잡히기 때문에 getImage에서 발생한 에러는 위의 catch 구문에 의해서 처리되게 됩니다. 그렇다면 다음 코드는 어떻게 동작할까요? scope.launch { try { val deferredImage1 = async { getImage("..
평소 항상 Date클래스와 Calendar클래스를 쓰며 파싱이라곤 SimpleDateFormat을 사용해서 동작은 하게 코드를 짜고있었는데요. 사람이 살다보니 좀더 포멀하게 코드를 짜야할 상황을 마주하게 되고 이 참에 이 불편한 코드를 개선해보자고 생각해서 찾아봤습니다. 뭐 이런 문자열을 파싱하고 싶은겁니다. 2017-05-06T00:36:45+09:00 2017-06-21T15:59:30.000+09:00 ISO 8601이라고 하는데요. 여기에 시간 Offset까지 포함된 친구입니다. 실행 코드 다음을 build.gradle에 추가하세요. android { defaultConfig { // minSdkVersion가 20 이하일 때만 적용하세요. multiDexEnabled true } compileO..
two-way binding을 하기 위해서 총 3가지의 함수가 필요합니다. 각 용도는 이런 식으로 생각할 수 있는데요. 데이터를 받아서 view에 설정하는 것 (BindingAdapter) view의 데이터가 변경되었을 때, 변경된 데이터 받아오는 것 (InverseBindingAdapter) 그런데, InverseBindingAdapter는 어떻게 view 데이터 변경을 알아차리는 걸까요? 바로, InverseBindingAdapter의 관련된 event를 등록하고, 해당 이벤트의 인자로 들어오는 InverseBindingListener.onChange()가 호출되는 순간을 알게되는 겁니다. view의 데이터가 변경되었음을 알리는 이벤트를 등록하는 것 (android:xxxxAttrChanged) 여기..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bEs8ub/btrdesLANkx/hAt3yCb40huPagGaoHYtak/img.png)
상황 개인 프로젝트를 개발하고 있는데 잘만 동작하던 앱이 갑자기 죽기 시작했습니다. 내가 최근 작업에서 건드린 부분이 아닌데 왜 이러나 한참 헤매었습니다. CustomFont로드 시점에 OutOfMemory가 나면서 죽는 경우였습니다. 코드는 다음과 같았습니다. fun getSLightTypefaceSpan(context: Context): CustomTypefaceSpan { return CustomTypefaceSpan( Typeface.create( ResourcesCompat.getFont( context, R.font.s_light ), Typeface.NORMAL ) ) } 이 코드를 모든 화면에서 사용하고 있었습니다. TLDR Resource를 접근하는 코드는 캐시 하자. 폰트 사이즈가 너무..