티스토리 뷰
이전 글에서 안드로이드에서 백 버튼 이벤트를 다룬 적이 있습니다.
위의 예제에서는 시간 차이를 이용해서 이벤트를 처리해 보았습니다. 우선 위의 예제를 Kotlin으로 바꾸어 작성해 보겠습니다.
백 버튼 이벤트 (Kotlin)
1 2 3 4 5 6 7 8 9 10 | private var first_time : Long = 0 private var second_time : Long = 0 override fun onBackPressed() { second_time = System.currentTimeMillis() if(second_time - first_time < 2000){ super.onBackPressed() finish() }else Toast.makeText(this,"뒤로가기 버튼을 한 번 더 누르시면 종료!",Toast.LENGTH_SHORT).show() first_time = System.currentTimeMillis() } | cs |
링크의 Java 예제와 똑같이 작성하였습니다. 그러면 이를 RxJava2를 이용해서 구현해 보겠습니다.(저도 배우고 있는 입장이라 정답은 아닙니다.)
백 버튼 이벤트 (with RxJava2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private val backButtonSubject : Subject<Long> = BehaviorSubject.createDefault(0L) private fun backEvent(){ backButtonSubject.buffer(2,1) .observeOn(AndroidSchedulers.mainThread()) .subscribe { t -> if (t[1] - t[0] <= 1500) { finish() }else Toast.makeText(this,"뒤로가기 버튼을 한 번 더 누르시면 종료!",Toast.LENGTH_SHORT).show() } } override fun onBackPressed(){ backButtonSubject.onNext(System.currentTimeMillis()) } | cs |
값을 발행할 수도 구독할 수도있는 Subject를 이용해서 구현을 해보았습니다. 백 버튼을 누를 당시 값이 필요하므로 BehaviorSubject 클래스를 사용하였습니다. BehaviorSubject는다음의 다이어그램과 같이 동작합니다.
값이 있기 전에 구독하면 기본값으로 정한 값이 들어오게되고 값이 발행 중 구독을 하면 최근 발행된 값을 얻습니다. 이러한 동작으로 처음에는 0값을 주었고, 핸드폰의 백 버튼을 누를 때마다 그 때의 시간이 발행됩니다. buffer 연산자를 사용하여 List로 묶어서 2개씩 값이 나오게 했으며 skip을 1로 줌으로서 매번 모든 2개중 1개를 다음 발행 때 건너뛰게 됩니다. 그리고 Default 값이 있기 때문에 맨 처음에 뒤로가기 버튼을 눌러도 0과 최근 시간을 얻을 수 있습니다. 이러한 원리로 최근 누른 값과 이전 시간을 비교하여 앞선 예제처럼 처리를 하였습니다.
Rx 입장으로 생각하기가 아직 서툴러 RxJava2를 기반으로한 RxAndroid의 개념이 이해가 되는 듯 안되는 듯 합니다. 여러가지 예제를 적용해보면서 Rx적인 생각을 길러야겠습니다.
'안드로이드' 카테고리의 다른 글
[안드로이드] 주차 위치 앱(주차 위치) (2) | 2021.12.06 |
---|---|
[안드로이드] 안드로이드 Activity 생명주기 (0) | 2018.07.09 |
[안드로이드] Java와 Kotlin의 간단한 비교 (1) | 2018.07.07 |
[안드로이드] WebView를 이용한 간단한 Javascript 통신 (0) | 2018.07.04 |
[안드로이드] MQTT를 이용한 채팅서비스 만들기(3) (16) | 2018.05.02 |
- Total
- Today
- Yesterday