본문 바로가기

728x90
반응형

Android/이론

(14)
[Java/kotlin] Hex String의 Int 변환 16bit Hex String to Signed Int java int i = (short) Integer.parseInt("FFFF", 16); kotlin val i: Short = Integer.parseInt("FFFF",16).toShort() 16bit Hex String to Unsigned Int java int i = Integer.parseUnsignedInt("FFFF", 16); kotlin val i = "FFFF".toLong(16) 32bit Hex String to Signed Int java int x = (int)Long.parseLong("FFFFFFFC", 16); // x = -4 kotlin val x = "FFFFFFFC".toLong(16).toInt() // ..
[안드로이드] RxJava Flowable 알아보기 (위키 번역) Flowable (RxJava Javadoc 2.2.21) Returns a Flowable that emits the results of a specified combiner function applied to combinations of five items emitted, in sequence, by five other Publishers. zip applies this function in strict sequence, so the first item emitted by the new Publisher wi reactivex.io Flowable class는 팩토리 메서드와 중간 오퍼레이터, reactive dataflow를 소비할 수 있는 기능을 제공하고, Reactive Stream패턴을 구현한..
[안드로이드] Koin으로 주입된 viewModel 쉽게 Unit 테스트 하기 dependency 추가 기본으로 추가되어있는 dependency 외에 mockito, truth를 추가하였습니다. dependencies { implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1..
[안드로이드] Cold flows, Hot channels(번역) Cold flows, Hot channels Cold flows, hot channels Kotlin coroutines were missing a primitive to represent cold asynchronous streams of data. Not anymore. Welcome Kotlin Flows. elizarov.medium.com 비동기식, 장기 또는 원격 작업들은 future type을 통해 표현될 수 있으므로, 값을 반환하는 함수는 다음과 같이 구현될 수 있습니다. fun fooAsync(p: Params): CompletableFuture = CompletableFuture.supplyAsync { bar(p) } fooAsync(p)를 호출하면 미래에 값을 제공하겠다는 약속을 가..
[안드로이드] Fragment 안의 Fragment 처리(교체, 백스택, Back 버튼 클릭 등) ― parentFragmentManager vs childFragmentManager Fragment안에 Fragment를 추가하여 더 관리할 경우가 생기는데요, 예를들어 ViewPager나 TabLayout의 Fragmet중 하나에서 Fragment를 여러개 교체하거나 관리할 수 있습니다. MainActivity에 Fragment1과 Fragment2가 있고, Fragment1 에서 ChildFrag1. ChildFrag2, ChildFrag3 을 추가하거나 교체한다고 생각해보겠습니다. MainActivity > Fragment1, Fragment2 Fragment1 > ChildFrag1,ChildFrag2,ChildFrag3 Fragment 추가/교체 MainActivity에 Fragment1을 추가 val fragment1 = Fragment1().getInstance() supp..
[안드로이드] MediatorLiveData를 이용하여 여러개의 LiveData를 하나의 LiveData로 합치기 Next 버튼의 활성화/비활성화를 LiveData로 만들고 싶은데, 이에 영향을 주는 LiveData가 2개 이상입니다. MediatorLiveData를 사용하면 여러개의 LiveData를 다시 mapping할 수 있습니다. 저는 무려 4개였습니다 ..ㅎㅎ class MyViewModel(private val repository: Repository): ViewModel() { val emg1Connected: LiveData = repository.deviceEmg1.connected val emg2Connected: LiveData = repository.deviceEmg2.connected val emg1Calibrated: LiveData = repository.deviceEmg1.calibrat..
[안드로이드 Kotlin] Room Database, Repository, ViewModel을 Koin으로 의존성 주입(DI) Koin DI(Dependecy Injection, 의존성 주입)는 구성요소들의 의존관계가 소스 내부가 아닌 외부에서 설정되도록 하는 디자인 패턴입니다. public class PetOwner{ private AnimalType animal; public PetOwner() { this.animal = new Dog(); } } 위와 같은 예제 코드 처럼 PetOwner()클래스는 Dog()클래스에 의존적인 상황이 되겠죠. 따라서 하나의 클래스만 변경하여도 의존한 다른 모듈까지 변경되는 상황이 됩니다. DI 디자인 패턴을 사용하면 객체의 생성과 사용을 분리시켜 재사용이 유연해집니다. Koin은 다른 의존성프레임워크인 Dagger2와 달리 러닝커브가 높지 않습니다. 기존 Repository는 singlet..
ViewModel과 View(Activity, Fragment)간의 이벤트 처리― Event Wrapper 사용하기 ViewModel에서는 view를 참조할 수 없습니다. (하면 안됩니다.) 그래서 view를 참조하는 메서드는 Activity, Fragment 내에서 구현되게 되는데요. ViewModel안에서 그 메서드들이 필요할 때, 또는 ViewModel에서 View에 이벤트를 보내주어야할 때! LiveData를 이용해서 ViewModel의 변수 값을 변화시키고, 그 변수를 view에서 observer하는 방식으로 이벤트를 처리할 수 있습니다. 이것이 아주 간편한 방식이죠. 예를 들어, 텍스트를 입력하다 버튼 클릭 시 키보드를 숨겨야 하는 Fragment의 메서드 hideKeyboard() 메서드를 실행해야 합니다. ViewModel에서 hideKeyboard 변수를 라이브데이터로 만들어주고, Fragment에서 ..

728x90
반응형