[RxJava] DoOnSubscribe, doFinally로 조금 스마트하게 쓰세요.

이런 작법도 할 수 있다고 생각하기 때문에 필기와 동시에 투고한다
버전은 RxJava2.1.9입니다.

같은 처리를 두 군데에서...


VP에 프로그램을 설치하면 Presenter에 다음 코드를 쓰고 싶습니다.
SamplePresenter.kt

override fun onClick() {
    view.showProgress()

    sampleInteractor.getItems()
        .subscribeBy(
            onSuccess = {

                // do something

                view.hideProgress()
            },
            onError = {

                // error handling

                view.hideProgress()
            }
        ).addTo(disposable)
}
View에서 클릭한 이벤트가 오면 진도를 표시하고, 어떤 처리를 하고, 성공한 경우onSuccess나 오류가 발생한 경우onError가 각각 진도를 숨기는 경우가 흔하다.
여기서 신경 쓰이는 것은 view.hideProgress()의 처리가 두 곳에 있다는 것이다.만약 같은 처리가 있다면, 어떻게 한 곳에 쓸 수 있겠는가...
그때 사용할 수 있는 것은 doFinally 이다.

doFinally


Javadoc에서
Calls the specified action after this Single signals onSuccess or onError or gets disposed by the downstream.
에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.결국 마지막으로 부르고 싶은 것이 있으면 여기에 쓰면 된다.(여기는 약간 자신이 없는 곳
아까 코드로 돌아가면 view.hideProgress() 마지막으로 부르고 싶은 처리이기 때문에 doFinally 아래와 같이 쓸 수 있습니다.
SamplePresenter.kt

override fun onClick() {
    view.showProgress()

    sampleInteractor.getItems()
        .doFinally {
            view.hideProgress()
        }
        .subscribeBy(
            onSuccess = {
                // do something
            },
            onError = {
                // error handling
            }
        ).addTo(disposable)
}
두 곳에 흩어져 있는 view.hideProgress() 을 한 곳으로 정리했습니다!
이번에 공동으로 진행된 처리는 view.hideProgress()뿐이지만 여러 처리onSuccessonError를 반복하면 전망이 좋아진다.또 잊어버리는 것을 방지하는 데도 도움이 될 것 같다.
그렇다면 이 단계에서 코드로 충분하겠지만 view.showProgress() 고립된 느낌입니다. 어차피 Rx의 절차에 따라 기술하고 싶은데...!
그때 사용할 수 있는 것은 doOnSubscribe 이다.

doOnSubscribe


Javadoc에서
Calls the shared consumer with the Disposable sent through the onSubscribe for each SingleObserver that subscribes to the current Single.subscribe라고 적혀 있을 때 불리는 것 같다.
바로 doOnSubscribe로 다시 쓸게요.
SamplePresenter.kt

override fun onClick() {
    sampleInteractor.getItems()
        .doOnSubscribe {
            view.showProgress()
        }
        .doFinally {
            view.hideProgress()
        }
        .subscribeBy(
            onSuccess = {
                // do something
            },
            onError = {
                // error handling
            }
        ).addTo(disposable)
}
고립된 느낌view.showProgress()이지만 Rx의 흐름을 잘 따라 조금 스마트하게 쓸 수 있겠죠!

총결산

  • 사용doFinally을 통해 두 곳에 흩어진 처리를 한 곳으로 정리한다.

  • 사용doOnSubscribe을 통해 Rx의 절차에 따라 기술할 수도 있습니다.
  • RxJava는 아직 모르는 기능, 편리한 기능이 있어야 하기 때문에 더 스마트하게 쓰기 위해 공부하고 싶다

    참고 자료


    [RxJava를 사용한 통신에서 진행 대화 상자 보내기]
    https://qiita.com/boohbah/items/e8010730725c54f85a3a

    좋은 웹페이지 즐겨찾기