728x90
반응형
- [ Android/Android ][Android] SharedPreferences를 대체할 DataStore에 대해 알아보자2024-01-19 11:53:37DataStore SharedPreferences를 대체 개선된 신규 데이터 저장소 솔루션 Kotlin 코루틴과 Flow를 기반으로 함 비동기적이고 일관된 트랜잭션 방식으로 데이터를 저장 → SharedPreferences의 단점을 일부 극복 UI 스레드 차단 디스크 I/O 작업을 하는 동기 API가 존재 apply()는 fsync()에서 UI 스레드를 차단합니다. 대기 중인 fsync() 호출은 서비스가 시작되거나 중지될 때마다, 그리고 애플리케이션에서 활동이 시작되거나 중지될 때마다 트리거됩니다. UI 스레드는 apply()에서 예약한 대기 중인 fsync() 호출에서 차단되며 주로 ANR의 소스가 됩니다. 런타임 예외 파싱 오류를 런타임 예외로 처리 Preferences DataStore와 Prot..
- [ pinslog ]100일 챌린지를 끝마치며2023-12-31 16:59:08https://pinslog.tistory.com/155 다시 시작 별다를 것 없던 스터디 와중 루디님이 9월 23일이 되면 2023년까지 100일이 남게 되고, 이 날부터 꾸준히 무언가를 매일 하면 100일동안 하게 되는 것이라고 알려주었다. 습관을 들이는데는 보통 60 www.pinslog.com https://pinslog.tistory.com/256 [Android] BottomSheetDialog WW 앱의 업데이트 상태를 알리기 위한 방법으로 바텀 시트 다이얼로그를 선택했다. 이전에는 기본 다이얼로그를 커스텀해 사용하는 방식을 많이 선택했는데 요즘 앱들을 살펴보면 바텀 시트 다 www.pinslog.com 100일 챌린지를 시작하고 (위) 어제까지 작성한 글(아래)이다. 중간에 챌린지 말고 하..
- [ Android/Android ][Android] BottomSheetDialog2023-12-30 18:52:15WW 앱의 업데이트 상태를 알리기 위한 방법으로 바텀 시트 다이얼로그를 선택했다. 이전에는 기본 다이얼로그를 커스텀해 사용하는 방식을 많이 선택했는데 요즘 앱들을 살펴보면 바텀 시트 다이얼로그로 상호작용을 많이 하는 것 같아 한번 구현해보기로 했다. 바텀 시트 다이얼로그에도 종류가 있는데, 자세한 것은 아래의 링크에 잘 설명이 되어 있으니 참고하면 좋다. 오늘 구현해 볼 것은 Modal bottom sheet이다. Bottom Sheet Dialog 예제 : Modal, Persistent, 모서리 둥글게 등 1. Bottom Sheet Dialog 1-1. 개념 1-2. 종류와 차이 2. Modal Bottom Sheet 2-1. 기본 예제 2-2. 모서리가 둥근 예제 2-3. 버튼이 있는 예제 2-4..
- [ Android/Android ][Android] AppUpdateManager 앱 업데이트 확인하기2023-12-29 22:37:25앱을 사용하다 가끔 업데이트 하라는 팝업을 본 적이 있을 것이다. 앱의 버전을 확인하고, 업데이트가 필요할 경우 플레이스토어로 이동할 수 있도록 기능을 추가해보려고 한다. AppUpdateManager 앱이 자체 업데이트를 시작할 수 있도록 하는 작업을 관리하도록 도와주는 인터페이스이다. 그러니까 인앱 업데이트를 구현하기 위한 클래스인데, 이번에는 업데이트 필요 여부에 관한 것 정도만 확인할 예정이다. 초기화 val appUpdateManager = AppUpdateManagerFactory.create(context) 업데이트 상태 확인 fun getAppUpdateStatus() { // 업데이트 가능한지 확인 val appUpdateInfoTask = appUpdateManager.appUpdate..
- [ Android/Android ][Android] 권한 요청 워크 플로우2023-12-28 22:58:39앱을 사용할 때 사용자의 위치에 접근하거나, 미디어 파일에 접근해야하는 경우 권한을 요청하는 다이얼로그를 본 적이 있을 것이다. 오늘은 권한 요청을 위한 작업 순서에 대해 알아보도록 할 것이다. 개인 프로젝트인 WW (기온별 옷차림 안내 어플) 을 개발하며 작성해두었던 내용임을 참고하길 바란다. 앱의 매니페스트 파일에서 앱에 요청할 필요가 있을 권한 선언 특정 비공개 사용자 데이터에 액세스 해야하는 앱의 작업을 사용자가 호출할 때까지 기다림 → 호출했을 때 런타임 권한을 부여했는지 확인 WW의 경우 위에서 선언한 것처럼 ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 권한이 필요함. -> 위치 권한이다. ActivityCompat.checkSelfPermission 권한 ..
- [ pinslog/Log.daily() ][Kotlin] Kotlin Destructuring2023-12-27 18:36:42때로는 객체를 여러 변수로 분해하는 것이 더 편리할 때가 있다. 이를 코틀린에선 구조 분해 할당(구조 분해 선언)이라고 하며, 한번에 여러 변수를 생성할 수 있다. data class Person( val name: String, val age: Int, ) fun main() { val person = Person("David", 30) val (name, age) = person println(name) // David println(age) // 30 } 이는 다음과 같이 컴파일 된다. val name = person.component1() val age = person.component2() 데이터 클래스가 자동으로 componentN() 를 제공하며, 클래스에서 직접 구현하기 위해서는 다음과 같..
- [ pinslog/Log.daily() ][Kotlin] takeIf2023-12-26 22:25:37주어진 조건을 만족하는 경우 해당 객체를 반환하는 함수이다. (만족하지 못하는 경우 null을 반환함) takeIf는 단일 객체에 대한 필터링을 도와준다. inline fun T.takeIf(predicate: (T) -> Boolean): T? 주어진 조건 (it.age > 30) 을 만족하는 경우 해당 객체를 반환 그렇지 않은 경우 null을 반환하는 것을 확인할 수 있다. data class Person( val name: String, val age: Int, ) fun main() { val list = listOf(Person("amy", 34), Person("john", 45), Person("tom", 27)) list.forEach { println(it.takeIf { it.age >..
- [ Do what you want/집단지성의 방 ]집단지성의 방 : 두번째 방의 문을 닫으며2023-12-25 10:25:11집단지성의 방 : 두번째 방의 문을 닫으며 집단지성의 방 : 첫번째 방의 문을 닫으며집단지성의 방 : 첫번째 방의 문을 닫으며 안녕하세요. 핀수입니다. 올해 초 처음 개설했던 스터디 집단지성의 방의 송년회를 오늘 랜선으로 개최했습니다. 이렇게까지 진지하게 할 생각은 없었www.pinslog.com안녕하세요. 핀수입니다. 벌써 2023년이 저물고, 집단지성의 방 두번째 송년회를 개최하게 되었습니다. 아마 우리 셋 중 그 어느 누구도 두번째 송년회를 할 수 있을 것이라고 생각하지 않았을 겁니다. (ㅋㅋ) 그렇게 생각할만 하기도 한 것이, 올해는 다들 업무와 개인적인 삶에 치여 집지방을 작년보다는 풍족하게 꾸려나가지 못했던 것 같습니다. 이번에는 북클럽와 해커톤을 진행했는데요, 개인적으로는 꼭 해보고 싶었던 ..
728x90
반응형