티스토리 뷰

이전 글에서 안드로이드에서 백 버튼 이벤트를 다룬 적이 있습니다.

[안드로이드] 뒤로가기 버튼 이벤트 예제

위의 예제에서는 시간 차이를 이용해서 이벤트를 처리해 보았습니다. 우선 위의 예제를 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적인 생각을 길러야겠습니다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday