안드로이드
[리엑티브 연습] merage, debounce (로그인 예제)
Black-Jin
2019. 6. 24. 18:17
반응형
안녕하세요. 블랙진입니다.
리엑티브 연습 포스팅 입니다.
build gradle
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
}
사용한 리액티브 함수
1. 여러 옵저버블을 합쳐줍니다.
2. 합쳐준 옵저버블의 값이 리턴됩니다.
3. 만일 합친 옵저버블읜 리턴 값이 다른개 1개라도 있다면 Any 값을 발행합니다.
사용 예)
여러 View의 값을 한 곳에서 처리할 때 사용합니다.
1. 아이템 발행 중 특정 시간 안에 다른 아이템이 발행 되면 발행 중인 아이템을 취소하고 최신 아이템만 발행합니다.
사용 예)
버튼의 다중 클릭을 막을 때 사용합니다.
<참고자료>
반응형