정상에서 IT를 외치다

[리엑티브 연습] merage, debounce (로그인 예제) 본문

안드로이드

[리엑티브 연습] merage, debounce (로그인 예제)

Black-Jin 2019. 6. 24. 18:17
반응형

안녕하세요. 블랙진입니다. 

리엑티브 연습 포스팅 입니다.


build gradle


자바 8 사용

android {
 
...
 
// Configure only for each module that uses Java 8
 
// language features (either in its source code or
 
// through dependencies).
  compileOptions
{
    sourceCompatibility
JavaVersion.VERSION_1_8
    targetCompatibility
JavaVersion.VERSION_1_8
 
}
}



리액티브 추가

//rx android
def rxandoirdVersion = '2.1.1'
def rxjavaVersion = '2.2.8'
implementation "io.reactivex.rxjava2:rxandroid:$rxandoirdVersion"
implementation "io.reactivex.rxjava2:rxjava:$rxjavaVersion"

//rx binding
def rxBindingVersion = '2.2.0'
implementation "com.jakewharton.rxbinding2:rxbinding-appcompat-v7:$rxBindingVersion"
implementation "com.jakewharton.rxbinding2:rxbinding-appcompat-v7-kotlin:$rxBindingVersion"


LoginContract

interface LoginContract {

interface View {

fun getEmail(): String

fun getPassword(): String


fun getEmailChanges(): Observable<CharSequence>

fun getPasswordChanges(): Observable<CharSequence>

fun getLoginClicks(): Observable<Unit>


fun setLoginBtnState(state: Boolean)

}

interface Presenter {

fun subscribeViewState()
}
}


LoginPresenter

class LoginPresenter(
private val view: LoginContract.View,
private val compositeDisposable: CompositeDisposable
): LoginContract.Presenter {

//각 뷰 상태들을 구독
override fun subscribeViewState() {

val etEmailChanges = view.getEmailChanges()
val etPasswordChanges = view.getPasswordChanges()
val btnLoginClicks = view.getLoginClicks()

Observable.merge(etEmailChanges, etPasswordChanges, btnLoginClicks)
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {

val isValidEmail = isValidEmail(view.getEmail())
val isValidPassword = isValidPassword(view.getPassword())

when(it) {
is CharSequence -> view.setLoginBtnState(isValidEmail && isValidPassword)
is Unit -> if(isValidEmail && isValidPassword) requestLoginApi()
}
}
.also {
compositeDisposable.add(it)
}
}

private fun requestLoginApi() {
Log.d("MyTag","requestLoginApi")
}

private fun isValidEmail(text: String) = text.length > 4

private fun isValidPassword(text: String) = text.length in 7..12
}



사용한 리액티브 함수


Merge


1. 여러 옵저버블을 합쳐줍니다.

2. 합쳐준 옵저버블의 값이 리턴됩니다.

3. 만일 합친 옵저버블읜 리턴 값이 다른개 1개라도 있다면 Any 값을 발행합니다.


사용 예)

여러 View의 값을 한 곳에서 처리할 때 사용합니다.


debounce


1. 아이템 발행 중 특정 시간 안에 다른 아이템이 발행 되면 발행 중인 아이템을 취소하고 최신 아이템만 발행합니다.


사용 예)

버튼의 다중 클릭을 막을 때 사용합니다.



<참고자료>

[드로이드 나이츠2019] 하동현 - 지금까지 이런 간단한 Login 처리는 없었다.

반응형
Comments