250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 안드로이드 sunflower
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 알고리즘
- 부스트코스
- 막내의막무가내 플러터
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 SQL
- 주택가 잠실새내
- 막내의 막무가내
- 막내의막무가내 일상
- 막내의 막무가내 알고리즘
- 막내의막무가내 플러터 flutter
- flutter network call
- 막내의막무가내 안드로이드
- 부스트코스에이스
- 막내의막무가내 목표 및 회고
- Fragment
- 막내의막무가내 코볼 COBOL
- 프래그먼트
- 막무가내
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내
- 막내의막무가내 코틀린
- 안드로이드
- 안드로이드 Sunflower 스터디
- 막내의막무가내 프로그래밍
- 막내의막무가내 rxjava
- 2022년 6월 일상
- 주엽역 생활맥주
- 프로그래머스 알고리즘
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] BaseViewModel 기본적인 Rx 서버 통신 작업을 위한 공통 함수 기록 본문
728x90
RxJava 를 다양하게 사용하겠지만 단순 네트워크 통신으로 사용시 코드가 길어지는 경향이 있어
이를 BaseViewModel 에서 공통 함수를 만들어 사용하면 좋지 않을까 하고 만들어봤습니다.
RxJava를 더 간단하게 작업하기 위해 Wrapping 하는 정석적이거나 많이 사용하는 코드가 있을거 같은데 아직 찾지 못하여 내가 그냥 간단히 만들고 기록해봄당..
만든 샘플 예제 코드는 다음과 같습니다.
1. Single, Flowable, Completable 의 기본적인 네트워킹 작업에 대한 Base excute() 메소드
2. 이 BaseViewModel 을 상속후에 어떻게 활용하는지 exampleXXXXcall() 메소드로 예제
덕분에 빠르게 개발하고 기본적인 네트워킹 작업이 많은 경우 두 줄만으로 작업을 할 수 있을 것 같습니다 :)
주석도 적혀있고 기본적인 코드라 이해하기 어렵진 않습니다.
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.mtjin.nomoneytrip.data.home.Product
import com.mtjin.nomoneytrip.utils.TAG
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.schedulers.Schedulers
abstract class BaseViewModel : ViewModel() {
protected val compositeDisposable = CompositeDisposable()
val _productListLiveData = MutableLiveData<List<Product>>()
val _errorMessageLiveData = MutableLiveData<String>()
val _isSuccess = MutableLiveData<Boolean>()
val _loading = MutableLiveData<Boolean>()
val loading: LiveData<Boolean> get() = _loading
// 일반적인 네트워크 통신시 사용할 base 통신 함수
protected fun <T : Any> excute(
single: Single<T>,
res: (T) -> Unit,
isShowLoad: Boolean = true
) {
single.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { if (isShowLoad) _loading.value = true }
.doAfterTerminate { if (isShowLoad) _loading.value = false }
.subscribeBy(onSuccess = {
res(it)
}, onError = {// 에러나면 해당 에러메시지 토스트메시지로 띄워줌
Log.e(TAG, "ViewModel Single Excute() onError -> " + it.message)
_errorMessageLiveData.value = it.message
})
.addTo(compositeDisposable)
}
protected fun <T : Any> excute(
flowable: Flowable<T>,
res: (T) -> Unit,
isShowLoad: Boolean = true
) {
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { if (isShowLoad) _loading.value = true }
.doAfterTerminate { if (isShowLoad) _loading.value = false }
.subscribeBy(onNext = {
res(it)
}, onComplete = {
Log.d(TAG, "ViewModel Flowable Excute() onComplete -> " + it.message)
}, onError = {// 에러나면 해당 에러메시지 토스트메시지로 띄워줌
Log.e(TAG, "ViewModel Flowable Excute() onError -> " + it.message)
_errorMessageLiveData.value = it.message
})
.addTo(compositeDisposable)
}
protected fun excute(
completable: Completable,
res: (Boolean) -> Unit,
isShowLoad: Boolean = true
) {
completable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { if (isShowLoad) _loading.value = true }
.doAfterTerminate { if (isShowLoad) _loading.value = false }
.subscribeBy(onComplete = {
res(true)
}, onError = {// 에러나면 해당 에러메시지 토스트메시지로 띄워줌
Log.e(TAG, "ViewModel Completable Excute() onError -> " + it.message)
_errorMessageLiveData.value = it.message
})
.addTo(compositeDisposable)
}
// Single 호출 방법예시
fun exampleSingleCall() {
excute(repository.requestProducts(), { items ->
_productListLiveData.value = items
})
}
// Flowable 호출 방법예시
fun exampleFlowableCall() {
excute(repository.requestProducts(), { items ->
_productListLiveData.value = items
})
}
// Completable 호출 방법예시
fun exampleFlowableCall() {
excute(repository.requestProducts(), { success ->
_isSuccess.value = success
})
}
}
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!
728x90
'안드로이드 > RxJava' 카테고리의 다른 글
[RxJava] 스케줄러 정리 (0) | 2020.12.30 |
---|---|
[RxJava] 결합 연산자 정리 (1) | 2020.12.22 |
[RxJava] 변환 연산자 정리 (0) | 2020.12.12 |
[RxJava] 생성 연산자 정리 (4) | 2020.12.01 |
[RxJava] Subject 클래스 간략 정리 (feat. Hot, Cold Observable차이) (4) | 2020.10.03 |
Comments