Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 커스텀린트
- 슬기로운 온라인 게임
- 캐치마인드
- 어떻게 나답게 살 것인가
- 프래그먼트
- 한달독서
- 한단어의힘
- 리얼하다
- 소프시스
- 브런치작가되기
- 자취필수템
- 테트리스
- 함수형 프로그래밍
- 한달어스
- 베드테이블
- 1일1커밋
- T자형인재
- 좌식테이블
- 면접
- 지지않는다는말
- 베드트레이
- 아비투스
- 목적 중심 리더십
- 목적중심리더십
- 안드로이드
- 재택근무
- 북한살둘레길
- 끝말잇기
- 소프시스 밤부 좌식 엑슬 테이블
- 한달브런치북만들기
Archives
- Today
- Total
정상에서 IT를 외치다
[리엑티브 연습] merage, debounce (로그인 예제) 본문
반응형
안녕하세요. 블랙진입니다.
리엑티브 연습 포스팅 입니다.
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. 아이템 발행 중 특정 시간 안에 다른 아이템이 발행 되면 발행 중인 아이템을 취소하고 최신 아이템만 발행합니다.
사용 예)
버튼의 다중 클릭을 막을 때 사용합니다.
<참고자료>
반응형
'안드로이드' 카테고리의 다른 글
[리엑티브 연습] Observable, Single, Maybe, Completable (0) | 2019.06.25 |
---|---|
[스트림 연습] Kotlin Collection Example (0) | 2019.06.25 |
[in-app updates] 안드로이드 인 앱 업데이트 사용기 (21) | 2019.06.21 |
[Firebase Crashlytics] 안드로이드 에러 리포트 사용기 (3) | 2019.06.20 |
[Android, Behavior] CoordinatorLayout 에서 Behavior 사용해 보기 (7) | 2019.05.13 |
Comments