안드로이드에서 RxJava2의 사용 중 하나-----Observable 만들기

16313 단어 RxJava2.x
전언
RxJava가 관찰자 모드를 바탕으로 하는 만큼 관찰자(Observer)와 피관찰자(Observable)를 조작해야 한다. 그러면 Observable를 어떻게 만드는가가 첫걸음이다.
Observable 작업자 만들기
  • just(): 데이터를 직접 발사하는 Observable
  • 만들기
  • from(): 하나의 그룹이나 목록에서 Observable
  • 로 변환
  • create(): Observable 만들기
  • defer(): 구독자가 구독할 때만 Observable를 만들고 구독마다 새로운 Observable를 만듭니다
  • range(): 지정된 범위의 시퀀스 Observable 만들기
  • interval(): 정해진 시간 간격으로 데이터를 발사하는 Observable
  • 만들기
  • timer(): 지연 송신 데이터의 Observable
  • empty(): 직접 완성된 Observable
  • error (): 잘못된 Observable 직접 발사
  • never(): 데이터를 송신하지 않는 Observable
  • just()
        //     
        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를 즐겁게 만들 수 있습니다.

    좋은 웹페이지 즐겨찾기