카운트 연속 클릭 시 마지막 카운트 api 호출 상황
RxKotlin을 사용하지 않고 처리하려면 까다로운 처리인데…
RxKotlin을 사용하면 간단하게 처리 할 수 있다.
class MainActivity : AppCompatActivity() {
var count = 0
val compositeDisposable: CompositeDisposable = CompositeDisposable()
var publishSubject: PublishSubject<String> = PublishSubject.create()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
textView.text = (++count).toString()
publishSubject.onNext(count.toString())
Log.d("kyh", "count : $count")
}
compositeDisposable.add(publishSubject
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnError {
Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
}
.subscribe { string ->
Toast.makeText(this, "publishSubject 사용~! api에 보낼 카운트 : $string", Toast.LENGTH_LONG).show()
})
compositeDisposable.add(RxTextView.textChanges(textView)
.debounce(300, TimeUnit.MILLISECONDS)
.map { charSequence -> charSequence.toString() }
.filter {
!it.equals("Hello World!")
}
.observeOn(AndroidSchedulers.mainThread())
.doOnError {
Toast.makeText(this, it.message, Toast.LENGTH_LONG).show()
}
.subscribe { string ->
Toast.makeText(this, "RxBinding 사용~! api에 보낼 카운트 : $string", Toast.LENGTH_LONG).show()
}
)
}
override fun onDestroy() {
super.onDestroy()
compositeDisposable.dispose()
}
}
debounce 를 사용하면 편하게 처리할 수 있다. 위의 소스는 PublishSubject 와 RxBidning Library의 RxTextView 를 사용한 예제 소스
둘중 마음에 드는 걸로 사용하면 됨
rx 문서에서는 debounce 를
only emit an item from an Observable if a particular timespan has passed without it emitting another item
라고 소개 한다.
아이템이 들어오다가 지정한 시간동안 아이템이 들어오지 않는 경우 마지막 아이템을 subscribe 를 통해 값을 보내준다. rx 는 마블을 보고 이해 하는게 제일 좋은 것 같다. 직관적으로 이해가 잘됨.