Android

비동기 함수 - Rx로 변경하기

그란. 2021. 5. 14. 22:51

1. Single ( 한번 받기 )

 

예제 : FirebaseMessage의 token 받기

 

기본 

var token : String

fun getInstanceId(){
	Firebase.messaging.token
    	  .addOnCompleteListener {
                token = it.result
            }
}

 

 

이렇게 하면 함수형이 아니게 된다.

그래서 Single.create로 변환 

override fun getInstanceId(): Single<String> {
        return Single.create { emitter ->
            Firebase.messaging.token
                .addOnCompleteListener { task ->
                    when (task.isSuccessful) {
                        true -> task.result?.let {
                            emitter.onSuccess(it)
                        }
                        false -> task.exception?.let {
                            emitter.onError(it)
                        }
                    }
                }
        }
}

 

 

 

2. Flowable (구독하는 방식)

 

예제 : Sendbird addChannelHandler 

 

기본

var unreadMessageCount : Int

fun getUnreadMessageCount(){

	SendBird.addChannelHandler(identifier, object : SendBird.ChannelHandler() {
 		override fun onMessageReceived(channel: BaseChannel, message: BaseMessage) {
          		val groupChannel = channel as GroupChannel
	        	unreadMessageCount = groupChannel.unreadMessageCount
		}
	})

}

 

Flowable.create 로 변경 

 fun subscribeTotalUnreadMessageCount(): Flowable<Int> {
        
        return Flowable.create({ emitter ->
        
            SendBird.addChannelHandler(identifier, object : SendBird.ChannelHandler() {
                override fun onMessageReceived(channel: BaseChannel, message: BaseMessage) {
                    val groupChannel = channel as GroupChannel
                    emitter.onNext(groupChannel.unreadMessageCount)
                }
            })
        }, BackpressureStrategy.LATEST)
   
}

센드버드에서 메시지가 업데이트 됐을때에만 해당 값을 받을 수 있다.

 

 

처음부터 앱을 로그인할때 구독해서 받기 위해선 

 fun subscribeTotalUnreadMessageCount(): Flowable<Int> {
        
        return Flowable.create({ emitter ->
       
       		//처음에 시작할때 값을 받기 위해서 해당 부분 추가
           SendBird.getTotalUnreadMessageCount { totalUnreadMessageCount, exception ->
                if (exception != null) {
                    emitter.onError(exception)
                } else if (!emitter.isCancelled) {
                    emitter.onNext(totalUnreadMessageCount)
                }
            }
       
        
            SendBird.addChannelHandler(identifier, object : SendBird.ChannelHandler() {
                override fun onMessageReceived(channel: BaseChannel, message: BaseMessage) {
                    val groupChannel = channel as GroupChannel
                    emitter.onNext(groupChannel.unreadMessageCount)
                }
            })
        }, BackpressureStrategy.LATEST)
   
}

Single 형태의 getTotalUnreadMessageCount 를 추가해준다.

 

 

'Android' 카테고리의 다른 글

TroubleShooting With AppbarLayout expand  (0) 2021.06.06
상품리스트 - 좋아요 - 툴팁 - 트러블 슈팅  (0) 2021.06.05
웹뷰 스크롤 전파  (0) 2021.04.03
Map vs FlatMap  (0) 2021.04.01
Data class + DiffUtil 이슈  (0) 2021.03.25