2017-09-20 13 views
0

Observableオブジェクトに実際のリスナーをラップしたいと思います。 ここでは、テストケースがあります。そのすべてが問題ありません。非同期リスナーをObservable(RxJava2)に変換/返信

private Flowable<Integer> getObservablePhoneState() { 
    return Flowable.create(emitter -> { 

     PhoneStateListener phoneStateListener = new PhoneStateListener() { 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       Log.i(TAG, "onCallStateChanged = " + state); 
       emitter.onNext(state); 
      } 
     }; 
     TelephonyManager telephonyManager = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); 
     telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

    }, BackpressureStrategy.BUFFER); 
} 

*** logcat *** 
io.reactivex.exceptions.OnErrorNotImplementedException: 
Attempt to read from field 'android.os.MessageQueue 
android.os.Looper.mQueue' on a null object reference 

Observable.create()同じエラーで:

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    getObservablePhoneState() 
     // Run on a background thread 
     .subscribeOn(Schedulers.io()) 
     // Be notified on the main thread 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(integer -> Log.i(TAG, "----- subscribe onNext = " + integer)); 
} 

private Flowable<Integer> getObservablePhoneState() { 
    return Flowable.create(emitter -> { 

     Log.i(TAG, "Emitting 1"); 
     emitter.onNext(1); 

     Log.i(TAG, "Emitting 2"); 
     emitter.onNext(2); 

    }, BackpressureStrategy.BUFFER); 
} 



*** logcat *** 
Emitting 1 
Emitting 2 
----- subscribe onNext = 1 
----- subscribe onNext = 2 

このコードは、エラーが発生します。 おそらく、これはRxJava2 does not support emitting a null valueという事実によるものです。

正しく行うには?

+0

あなたの活動の中でonCreate()の前に物事を呼び出すことは可能ですか?私はあなたのコードを試して、それは私のためにうまくいった。 –

答えて

1

PhoneStateListenerを別のスレッドに作成しないようにするには、subscribeOn(Schedulers.io())を削除する必要があります。これは、フードがmQueueがnullのハンドラを使用してメッセージを送信しようとしているためです。ちょうどお電話

getObservablePhoneState() 
    .subscribe { integer -> Log.i("", "----- subscribe onNext = " + integer) } 
+0

Thx、あなたのコメントが役に立ちました。コードが機能しました。しかし... onNextは1〜3回しか発生せず、さらに何もありません。私はAndroid 8の下でテストしています。私はライブラリの最新バージョンを使用しています。私は後でテストのための完全なコードを投稿します。おそらく、私はあまりにも複雑なListenerを選んだでしょう。 – tim4dev

+0

onNextが1〜3回呼び出されていますが、リスナーがさらに呼び出されましたか? – gyosida

+0

リスナーが死んでいて、(もちろん)onNext。 Android 4.2 - すべて正常です。 Android 8 - :( ネイティブリスナーは正常に動作しています フルコードはこちらhttps://github.com/tim4dev/dirty_code/tree/master/Rx-Listener-to-Observable – tim4dev

関連する問題