Android
Android Kotlin + OpenCV
1. 최신 OpenCV sdk 다운로드 다운로드 : opencv-4.5.1-android-sdk.zip 2 .OpenCV를 모듈로 추가 File > New > Import Module 메뉴 선택후 압축파일을 푼 경로에서 sdk 디렉토리를 선택한다. OpenCV를 안드로이드 스튜디오 모듈 형태로 추가하는 것이기 때문에 OpenCV SDK 디렉토리를 선택하면 모듈이름이 ‘sdk’로 지정된다. 그냥 써도 상관없지만 필자는 ‘opencv‘로 변경했다. 3. OpenCV 모듈을 app모듈의 의존성으로 추가하기 app 모듈 레벨의 build.gradle에 의존성 추가 dependencies { // OpenCV 4.5.1 implementation project(":opencv") } 4. OpenCV Native..
Jetpack/ LiveData, MutableLiveData, Databinding, BindingAdapter
LiveData/ MutableLiveData MutableLiveData는 Abstract Class 인 LiveData를 구현한 Public Class 라는 말을 풀어 보면, LiveData는 추상 클래스이므로 직접 생성할 수 없다. 반면에 MutableLiveData는 일반 클래스이므로 아래와 같이 직접 생성하고 초기화도 할 수 있다. LiveData는 변경될 수 없고, MutableLiveData는 변경될 수 있다는 말의 의미는 LiveData는 주어진 라이프사이클(lifecycle) 내에서 관찰(observer)할 수 있는 data Holder 역할을 하는데, LiveData에 데이터를 Set 할 수 있는 것은 이를 구현한 클래스에서 setValue/postValue를 통해서만 가능하다는 의미이..
Android for 모바일, 태블릿, 키오스크(Mobile, Tablet, Kiosk) px, dpi
Build 클래스 안드로이드에서 설치된 장비(디바이스)의 정보를 확인하는 방법으로 Build 클래스를 통해 디바이스의 정보를 확인해보겠습니다. 안드로이드 공식 사이트 : https://developer.android.com/reference/android/os/Build 코드로 확인 Log.d("jjslee", "BOARD: " + Build.BOARD) Log.d("jjslee", "SERIAL: " + Build.SERIAL) Log.d("jjslee", "VERSION.RELEASE: " + Build.VERSION.RELEASE) Log.d("jjslee", "MODEL: " + Build.MODEL) Log.d("jjslee", "MANUFACTURER: " + Build.MANUFACTURER..
메모리 프로파일러를 사용하여 앱의 메모리 사용량 검사
메모리 누수 메모리 프로파일러 앱의 메모리 사용 현황을 실시간 그래프로 보여주며, 메모리 프로파일러를 사용하여 힙 덤프를 캡처하고, 가비지 컬렉션을 강제 실행하고 메모리 할당을 추적할 수 있습니다. 메모리 프로파일링을 해야하는 이유 Android에서는 관리되는 메모리 환경을 제공합니다. 즉, 앱에서 일부 객체를 더 이상 사용하지 않는다고 판단되면 가비지 컬렉터가 사용되지 않는 메모리를 힙에 돌려보냅니다. Android에서 사용되지 않는 메모리를 찾는 방법은 끊임없이 개선되고 있지만, 모든 Android 버전의 특정 시점에서 시스템이 코드를 일시중지해야 합니다. 대부분의 경우 일시중지를 감지할 수 없습니다. 하지만, 시스템에서 메모리를 수집할 수 있는 것보다 빠르게 앱에서 메모리를 할당하는 경우 컬렉터가 ..
Transformations LiveData 변형하기
LiveData 안의 value 값을 업데이트해주기 위해 Transformations는 LiveData를 위한 클래스로써, LiveData를 사용하면서 데이터를 가공하거나, 다른 LiveData를 만들고 싶을 때 Transformations을 사용하면 된다. 관련 함수로는 map()과 switchMap()이 있다. Transformations.map val userLiveData: MutableLiveData = repository.getUser(id) val userNameLiveData: LiveData = Transformations.map(userLiveData) { user -> user.firstName + " " + user.lastName } map의 첫 번째 인자로 LiveData sou..