2017-09-20 6 views
0

Je veux envelopper un vrai écouteur à l'objet observable. Pour commencer, voici un cas de test, avec lui tout va bien.Convertir/wrap écouteur async à Observable (RxJava2)

@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 

Ce code génère une erreur:

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 

Avec Observable.create() la même erreur. Peut-être cela est dû au fait que RxJava2 does not support emitting a null value.

Comment faire les choses correctement?

+0

Est-il possible que vous appeliez chose avant onCreate() dans votre activité? J'ai essayé votre code et ça a bien marché pour moi. –

Répondre

1

Vous devez supprimer le subscribeOn(Schedulers.io()) pour éviter de créer le PhoneStateListener dans un thread différent, car sous le capot tente d'envoyer des messages à l'aide d'un gestionnaire dont mQueue est null. Il suffit d'appeler

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

Thx, votre commentaire était utile. le code a fonctionné. mais ... onNext se produit seulement 1--3 fois, et plus loin - rien. Je suis sous Android 8 et j'utilise les dernières versions des bibliothèques. Je posterai le code complet pour les tests plus tard. Peut-être ai-je choisi le Listener trop compliqué. – tim4dev

+0

onNext est appelé 1-3 fois mais votre auditeur a été appelé plusieurs fois? – gyosida

+0

Listener dead et (bien sûr) onNext. Android 4.2 - tout est OK. Android 8 - :( natif écouteur fonctionne bien Code complet ici https://github.com/tim4dev/dirty_code/tree/master/Rx-Listener-to-Observable – tim4dev