2017-08-18 9 views
1
Android Studio 3.0 Beta2 

私はobservableを作成するメソッドとサブスクライバを作成するメソッドを2つ作成しました。kotlinはRxJava2を使って観測値を観測するようにサブスクライバを取得します

ただし、私はサブスクライバに観測対象を登録させようとしています。 Javaでは、これはうまくいくでしょう。私はそれをKotlinで動作させようとしています。

私のonCreate(..)メソッドでこれを設定しようとしています。これを行う正しい方法ですか?任意の提案のための

class MainActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 

     /* CANNOT SET SUBSCRIBER TO SUBCRIBE TO THE OBSERVABLE */ 
     createStringObservable().subscribe(createStringSubscriber()) 
    } 


    fun createStringObservable(): Observable<String> { 
     val myObservable: Observable<String> = Observable.create { 
      subscriber -> 
      subscriber.onNext("Hello, World!") 
      subscriber.onComplete() 
     } 

     return myObservable 
    } 

    fun createStringSubscriber(): Subscriber<String> { 
     val mySubscriber = object: Subscriber<String> { 
      override fun onNext(s: String) { 
       println(s) 
      } 

      override fun onComplete() { 
       println("onComplete") 
      } 

      override fun onError(e: Throwable) { 
       println("onError") 
      } 

      override fun onSubscribe(s: Subscription?) { 
       println("onSubscribe") 
      } 
     } 

     return mySubscriber 
    } 
} 

多くのおかげで、

+0

「問題」とは何ですか?例外が発生するか、何も起こりません。 – toto2

答えて

5

は、種類に細心の注意を払います。あなたがしようとしているio.reactivex.Observer

タイプを受け入れio.reactivex.functions.Consumer

  • 1を受け入れること
  • いくつかの引数を受け付けない

    • 1:

      Observable.subscribe()は、3つの基本的なバリエーションがありますあなたの例でsubscribeはorg.reactivestreams.Subscriber(Reactive Streams Specificationの一部として定義されています)です。このタイプの完全な会計を得るにはrefer to the docsできますが、オーバーロードされたObservable.subscribe()メソッドのいずれとも互換性がないと言うだけで十分です。

      ここにコードをコンパイルすることができますあなたのcreateStringSubscriber()方法の変形例です:変更物事がある

      fun createStringSubscriber(): Observer<String> { 
           val mySubscriber = object: Observer<String> { 
            override fun onNext(s: String) { 
             println(s) 
            } 
      
            override fun onComplete() { 
             println("onComplete") 
            } 
      
            override fun onError(e: Throwable) { 
             println("onError") 
            } 
      
            override fun onSubscribe(s: Disposable) { 
             println("onSubscribe") 
            } 
           } 
      
           return mySubscriber 
          } 
      

      1. これは、(代わりにSubscriberの)Observer型を返す
      2. onSubscribe()は、DisposableSubscriptionの代わりに)

      .. 'Vincent Mimoun-Prat'で述べたように、ラムダ構文はコードを実際に短縮することができます。

      override fun onCreate(savedInstanceState: Bundle?) { 
           super.onCreate(savedInstanceState) 
           setContentView(R.layout.activity_main) 
      
           // Here's an example using pure RxJava 2 (ie not using RxKotlin) 
           Observable.create<String> { emitter -> 
            emitter.onNext("Hello, World!") 
            emitter.onComplete() 
           } 
             .subscribe(
               { s -> println(s) }, 
               { e -> println(e) }, 
               {  println("onComplete") } 
             ) 
      
           // ...and here's an example using RxKotlin. The named arguments help 
           // to give your code a little more clarity 
           Observable.create<String> { emitter -> 
            emitter.onNext("Hello, World!") 
            emitter.onComplete() 
           } 
             .subscribeBy(
               onNext  = { s -> println(s) }, 
               onError = { e -> println(e) }, 
               onComplete = {  println("onComplete") } 
             ) 
          } 
      

      私は助けてくれることを願っています!

  • +0

    ありがとう、それは本当に助けた。 – ant2009

    3

    はたくさんのことを簡素化し、コードをより簡潔になりますRxKotlinを見て、持っています。

    val list = listOf("Alpha", "Beta", "Gamma", "Delta", "Epsilon") 
    
    list.toObservable() // extension function for Iterables 
         .filter { it.length >= 5 } 
         .subscribeBy( // named arguments for lambda Subscribers 
           onNext = { println(it) }, 
           onError = { it.printStackTrace() }, 
           onComplete = { println("Done!") } 
         ) 
    
    +0

    では、.subscribe()パーツを作成するさまざまな方法を検討しています。そこにチュートリアルがたくさんあるようには見えません。 –

    関連する問題