전체 글

경험을 중요시합니다.
Android Compose에서 Context 사용하기 Compose - ComponentActivity에서는 기존 AppCompatActivity와는 다르게 바로 context를 가져올 수 없는 것을 발견했다. Compose에서는 현재 화면에 대한 Context를 참조하는 'LocalContext'를 활용해야 한다. class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { FeatherAndroidTasksTheme { // Provide the current context using Composition..
안드로이드 스튜디오 와이파이 활용 무선 디버깅 연결 방법 안드로이드에서 무선 디버깅으로 유선 필요 없이 연결하는 방법을 소개해보겠습니다. 안드로이드 스튜디오는 최신 버전으로 유지해야 합니다. OS 버전은 Android 11 이상이어야 한다고 확인됩니다. https://developer.android.com/studio/run/device?hl=ko#wireless 하드웨어 기기에서 앱 실행 | Android 스튜디오 | Android Developers Android 디버그 브리지(ADB) 연결을 통한 테스트 및 디버깅을 위해 개발 환경 및 Android 기기를 설정하는 방법을 알아보세요. developer.android.com 먼저 설정 - 개발자 옵션을 활성화해야 합니다. 이제 목록에 '무선 디버깅'..
Room DB 기본 설정 후, 데이터 저장 및 가져오기 Room DB 살펴보기 사내 서비스에서 기존에 사용하고 있던 Database가 SQLite, Realm DB 두 가지 종류였는데, 이번에 새로운 테이블 구성이 필요해서 Jetpack에서 제공하는 Room DB를 사용해 봤다. https://developer.android.com/training/data-storage/room?hl=ko Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com Room DB를 그냥 사용하려는 것은 아니고, 당연히 SQLite보다 장점이 있기에 사용하게 ..
앱 테스트 진행 중에 다음과 같은 Exception이 발생했다. Fatal Exception: java.util.ConcurrentModificationException 여러 스레드에서 하나의 컬렉션에 접근할 때, 동시성 문제가 발생하는 것으로 확인된다. 문제가 발생한 코드로 이동해 보니... object DataManager { private var dataInfos = ArrayList() ..... object Manager 내부의 dataInfos라는 리스트가 있고, 해당 DataManager가 외부에서 여러 스레드에 동시 호출되며 dataInfos에 접근하던 중 문제가 발생하는 것으로 확인했다. 싱글톤 하위 리스트를 여러 스레드 접근에 안전하도록 처리할 필요가 있었다. object DataMan..
다음과 같은 두 개의 List를 각각 인덱스 순서대로 짝을 맞추어 Map으로 변환하려 한다. zip() : 두 개의 리스트를 쌍으로 묶어준다. toMap() : Map으로 변환한다. val map = name.zip(yearning.toTypedArray()).toMap()
System 상에서 현재 애플리케이션을 완전히 종료시키는 로직 fun killApp(activity: Activity) { ActivityCompat.finishAffinity(activity) exitProcess(0) } 1. ActivityCompat.finishAffinity(activity) : 주어진 Activity와 해당 Activity 위에 쌓인 모든 Activity를 종료 2. exitProcess(0) : 현재 프로세스를 종료. 0은 정상 종료를 의미하는 코드 값
아래와 같이 api 호출 인터페이스를 구성하여 서버와의 통신을 시도했는데, EOFException이 발생했다. interface TestApi { @PUT("/api/test") fun update( @HeaderMap headers: HashMap, @Body request: BodyRequest ): Call } java.io.EOFException: End of input at line 1 column 1 path 통신 후, Response를 반환하는데 Empty Response를 반환하고 있었다. 하지만 내가 작업하면서 NormalResponse Type으로 반환되도록 구성하면서 발생하는 것이 원인이었다. 이 경우 2가지 해결 방법이 존재했다. 1. NormalResponse가 아니라 Unit으로..
제일 상위에 있는 차원의 배열을 해제해 준다. List 형태로 반환되며, 모든 중첩 배열을 해제해 주기 위해 n 차원만큼 flatten() 처리해주어야 한다. fun main() { val arr = arrayOf(arrayOf(1,2,3), arrayOf(7,8,9), arrayOf(arrayOf(100, 101, 102), arrayOf(201, 202, 203))) println(arr.contentDeepToString()) val arr2 = arr.flatten() println(arr2.toString()) }
사용자의 앱이 최신 버전인지를 판단하여 필요에 따라 플레이스토어에서 업데이트를 요구할 수 있는 로직이 필요했다. 마침 Android에서 제공하는 AppUpdateManagerFactory가 존재했다. https://developer.android.com/reference/com/google/android/play/core/appupdate/AppUpdateManagerFactory AppUpdateManagerFactory | Android Developers Stay organized with collections Save and categorize content based on your preferences. AppUpdateManagerFactory public final class AppUpdat..
사용자의 디바이스를 식별하거나 정보 파악을 위해서 id 또는 기기명, OS 버전 등의 확인이 필요한 경우가 있다. 이러한 정보를 Build Class에서 가져올 수 있다. GPT를 통해 확인한 Build Class에 담긴 정보는 아래와 같다. 1. Build.VERSION: Android 운영 체제의 버전 정보를 제공합니다. 예를 들어, Build.VERSION.SDK_INT를 통해 API 레벨(안드로이드 버전 코드)을 얻을 수 있습니다. 2. Build.VERSION_CODES: Android API 레벨을 상수로 정의한 클래스입니다. 코드에서 각 버전에 대한 조건을 확인할 때 사용됩니다. 3. Build.MODEL: 기기의 모델 이름을 제공합니다. 4. Build.MANUFACTURER: 제조사 정보..
SeungYong.Lee
Win-Dev