안드로이드에서 RxJava2의 사용 중 하나-----Observable 만들기
16313 단어 RxJava2.x
RxJava가 관찰자 모드를 바탕으로 하는 만큼 관찰자(Observer)와 피관찰자(Observable)를 조작해야 한다. 그러면 Observable를 어떻게 만드는가가 첫걸음이다.
Observable 작업자 만들기
//
Observable.just("abc")
.subscribe({
JLog.d("onNext:$it")
}, {
JLog.d("onError:$it")
}, {
JLog.d("onComplete")
}, {
JLog.d("onSubscribe")
}) 인쇄:
onSubscribe
onNext:abc
onComplete 물론 Just를 사용하여 데이터 세트를 전송할 수 있습니다.
Observable.just("1", "2", "3", "4", "5")
.subscribe({
JLog.d("onNext:$it")
}, {
JLog.e("onError:$it")
}, {
JLog.d("onComplete")
}, {
JLog.d("onSubscribe")
}) 인쇄:
onSubscribe
onNext:1
onNext:2
onNext:3
onNext:4
onNext:5
onComplete From()
Just를 사용하여 데이터 세트를 전송하면 From과 매우 유사합니다.
Observable.fromArray("a", "b", "c")
.subscribe({
JLog.d(it)
})
val items = arrayListOf("1", "2", "3")
Observable.fromIterable(items)
.subscribe({
JLog.d(it)
}) 인쇄:
a
b
c
1
2
3 create()
Observable.create(ObservableOnSubscribe {
try
{
if (!it.isDisposed)
{
for (i in 0..5)
{
it.onNext(i)
}
it.onComplete()
}
} catch (e: Exception)
{
it.onError(e)
}
}).subscribe({
JLog.d("onNext->$it")
}, {
JLog.e("onError->$it")
}, {
JLog.d("onComplete")
}, {
JLog.d("onSubscribe")
}) 인쇄:
onSubscribe
onNext->0
onNext->1
onNext->2
onNext->3
onNext->4
onNext->5
onComplete Defer()
defer 조작부호는 구독자가 구독할 때까지 Observable를 만들어서 최신 데이터가 있는지 확인합니다
var a = 1
val defer = Observable.defer {
Observable.just(a)
}
val just = Observable.just(a)
a++
just.subscribe({ JLog.d("just:" + it.toString()) })
defer.subscribe({
JLog.d("defer:" + it.toString())
}) 나는
a=1에 defer와just로 각각 Observable를 만들었는데 a++ 이후에야 그들을 소비했다. 먼저 결과를 살펴보자.just:1
defer:2 보시다시피just는 창설할 때 데이터를 전송하고 defer는 구독이 있을 때만 Observable를 창설합니다. a가 최신 값임을 보장합니다.
Timer()
시간 지연 조작부호, 기본적으로computation 스케줄러에서 실행되며, 일정 시간 지연된 후에 데이터를 발사합니다
Observable.timer(2, TimeUnit.SECONDS)
.subscribe(object : Observer
{
override fun onComplete()
{
}
override fun onSubscribe(d: Disposable)
{
JLog.d("onSubscribe")
}
override fun onNext(t: Long)
{
JLog.d("onNext")
JLog.d("onNext :$t")
}
override fun onError(e: Throwable)
{
JLog.e(e.toString())
}
}) 인쇄 결과:
10-15 17:40:22.734 19180-19180/com.jzd.jutils.app D/JLog: onSubscribe
10-15 17:40:24.735 19180-19627/com.jzd.jutils.app D/JLog: onNext
onNext :0 timer 지연 2s 후 0 반사
Interval()
간격 조작부호, 기본적으로computation 스케줄러에서 실행되며, 고정된 시간 간격 후에 데이터를 발사합니다
Observable.interval(1, TimeUnit.SECONDS)
.subscribe({ JLog.d(it.toString()) }) 인쇄 결과
10-15 17:44:15.022 21811-21902/com.jzd.jutils.app D/JLog: 0
10-15 17:44:16.021 21811-21902/com.jzd.jutils.app D/JLog: 1
10-15 17:44:17.021 21811-21902/com.jzd.jutils.app D/JLog: 2
10-15 17:44:18.021 21811-21902/com.jzd.jutils.app D/JLog: 3
10-15 17:44:19.021 21811-21902/com.jzd.jutils.app D/JLog: 4
10-15 17:44:20.021 21811-21902/com.jzd.jutils.app D/JLog: 5 interval에도 3개의 매개 변수의 생성 방법
interval(long initialDelay, long period, TimeUnit unit)이 있습니다. 먼저 시간 지연 시간을 지정한 다음에 다시 돌아가며 발송합니다..하지만 만약 당신이 처음으로 인터내셔널을 사용한다면 인터내셔널이 만든 발사기는 멈출 수 없다는 것을 알게 될 것입니다. 인터내셔널이 만든 발사기는 멈출 수 없습니다.그래서 정확한 조작 방식은 다음과 같아야 한다.Observable.intervalRange(10, 5, 1, 1, TimeUnit.SECONDS)
.subscribe({ JLog.d(it.toString()) }) 대응하는 방법은
intervalRange(long start, long count, long initialDelay, long period, TimeUnit unit)Repeat Repeat 조작부호는 창설 조작부호와 함께 사용할 수 있으며, 창설 시 중복 정책을 설정하면 Repeat로 한 그룹의 데이터를 중복 발사할 수 있습니다
Observable.just("1", "2", "3")
.repeat(2)
.subscribe({ JLog.d(it) }) 프린트
1
2
3
1
2
3 repeatWhen 사용
Observable.just("1")
.repeatWhen { Observable.timer(3, TimeUnit.SECONDS) }.subscribe({ JLog.d(it) })
JLog.d("---------------------------") 프린트
10-15 19:49:01.646 5814-5814/com.jzd.jutils.app D/JLog: 1
---------------------------
10-15 19:49:04.646 5814-6133/com.jzd.jutils.app D/JLog: 1 3초 후에 데이터를 한 번 반복해서 전송할 수 있습니다. RepeatUntil을 사용하십시오.
var count = 0
Observable.just(" ")
.repeatUntil { count >= 5 }
.subscribe({
JLog.d(" ${count++} :$it")
}) 인쇄 결과:
0 :
1 :
2 :
3 :
4 : 보시다시피
repeatUntil(BooleanSupplier stop)에서는 getAsBooleanfalse를 되돌릴 때 데이터를 중복 발사하고true를 되돌릴 때 데이터를 중지합니다.자주 사용하는 창설 조작부호는 기본적으로 소개되었습니다. 이 조작부호를 사용하면 다양한 Observable를 즐겁게 만들 수 있습니다.