목록전체 글 (140)
시배's Android
Hi Jack Mocker란? GitHub - koreatlwls/Hi-Jack-Mocker: Hi-Jack-Mocker is a project that leverages OkHttp3's interceptor to intercept and modify netHi-Jack-Mocker is a project that leverages OkHttp3's interceptor to intercept and modify network requests and responses, allowing you to verify the UI easily. - koreatlwls/Hi-Jack-Mockergithub.com Hi Jack Mocker는 비개발자도 UI 엣지 케이스를 쉽게 테스트할 수 있도록 돕는 라이브러리입..
Hi Jack Mocker란? GitHub - koreatlwls/Hi-Jack-Mocker: Hi-Jack-Mocker is a project that leverages OkHttp3's interceptor to intercept and modify netHi-Jack-Mocker is a project that leverages OkHttp3's interceptor to intercept and modify network requests and responses, allowing you to verify the UI easily. - koreatlwls/Hi-Jack-Mockergithub.comHi Jack Mocker는 비개발자도 UI 엣지 케이스를 쉽게 테스트할 수 있도록 돕는 라이브러리입니..
문제 TiTi에는 사용자가 자신의 공부 시간을 확인할 수 있는 TimeTable 기능이 있습니다. 어느 날 우연히 Layout Inspector를 사용하던 중, TimeTable에서 지속적으로 Recomposition 발생하고 있다는 사실을 발견했습니다.문제의 원인@Composablefun TdsTimeTable( modifier: Modifier = Modifier, timeTableData: List, colors: List,) { var hour by remember { mutableStateOf("0") } var fontSize by remember { mutableStateOf(7.sp) } val textStyle = Tds..
문제 Timer TiTi를 개발하며 겪었던 흥미로운 이슈와 그 해결 과정을 공유하려 합니다. 개발 과정 중 데이터는 정상적으로 업데이트되었지만, 특정 그래프가 화면에 표시되지 않는 문제에 직면했습니다. 문제의 원인 @Composable private fun TdsPieChart( modifier: Modifier = Modifier, taskData: List, colors: List, progress: Float, containsDonut: Boolean, totalTimeString: String?, ) { var startAngle = 270f val density = LocalDensity.current BoxWithConstraints( modifier = modifier, contentAlig..
21장 플로우 만들기 원시값을 가지는 플로우 flowOf를 활용해 간단하게 플로우를 만들 수 있다. flowOf(1, 2, 3, 4,5 ).colect { // TODO } 값이 없는 플로우면 emptyFlow의 형태로 제공 컨버터 asFlow를 활용해 다음과 같은 타입을 플로우로 바꿀 수 있다. Iterable Iterator Sequence Mono Flux List 등등 함수를 플로우로 선언하기 함수가 플로우를 반환하도록 할 수 있다. fun someFunction(): Flow = flow { // Do Something emit(2) } 플로우와 리액티브 스트림 Flux, Mono또한 라이브러리에서 플로우의 변환을 제공한다. kotlinx-coroutines-reactor라이브러리를 활용하라 채..
20장 플로우의 실제 구현 플로우의 내부구현에 대해 알아보자. Flow 이해하기 간단한 람다식 @Test fun main() = runTest { val f: () -> Unit = { println("A") println("B") println("C") } f() } // 출력 겨로가 A B C 플로우는 위의 람다식과 별반 다를것이 없다. 아래는 실제 플로우의 내부 구현을 간단하게 구현해본 것이다. @Test fun main() = runTest { val f: suspend ((String) -> Unit) -> Unit = { emit -> emit("A") emit("B") emit("C") } f { println(it) } f { println(it) } } // 출력 결과 A B C A B ..
TiTi Side Project | Composable 함수를 Bitmap으로 변환하기 Timer TiTi 프로젝트에서는 Card를 이미지로 변환하여 갤러리에 저장하거나 인스타그램에 공유하는 기능을 추가하려고 합니다. 이를 위해서는 Composable 함수로 구현된 View를 Bitmap으로 변환하는 로직 si8ae.tistory.com 갤러리 저장 먼저, 비트맵 객체를 PNG 포맷의 이미지 파일로 저장하는 과정을 살펴봅시다. 이를 위해 저는 먼저 저장할 파일의 위치와 이름을 정의해야 합니다. 여기서는 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)를 사용하여 공용 사진 디렉토리에 파일을 저장하고, 파일 이름은 "..
아이템49. 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 sequence 는 지연(lazy) 처리 된다. 따라서 시퀀스 처리 함수들을 사용하면, 데코레이터 패턴으로 꾸며진 새로운 시퀀스가 리턴된다. 시퀀스 처리 함수는 최정 연산이 이루어지기 전까지는 각 단계에서 연산이 일어나지 않는다. Iterable 은 처리 함수를 사용할 때마다 연산이 이루어져 List 가 만들어진다. 컬렉션 처리 연산은 호출할 때 연산이 이루어진다. 시퀀스의 지연 처리 장점 자연스러운 처리 순서를 유지 최소한만 연산 무한 시퀀스 형태로 사용 각각의 단계에서 컬렉션을 만들어 내지 않는다. 시퀀스가 빠르지 않은 경우 컬렉션 전체를 기반으로 처리해야 하는 연산은 시퀀스를 사용해도 빨라지지 않는다. sorted 는 Sequen..