Android 将异步侦听器转换/包装为可观察(RxJava2)

Android 将异步侦听器转换/包装为可观察(RxJava2),android,rx-java2,listeners,Android,Rx Java2,Listeners,我想把一个真正的监听器包装成一个可观察的对象。 首先,这里是一个测试案例,对他来说一切都很好 @Override public void onCreate(@Nullable Bundle savedInstanceState) { getObservablePhoneState() // Run on a background thread .subscribeOn(Schedulers.io()) // Be notified on t

我想把一个真正的监听器包装成一个可观察的对象。 首先,这里是一个测试案例,对他来说一切都很好

@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
@覆盖
创建时的公共void(@Nullable Bundle savedInstanceState){
getObservablePhoneState()
//在后台线程上运行
.subscribeOn(Schedulers.io())
//在主线程上收到通知
.observeOn(AndroidSchedulers.mainThread())
.subscribe(整型->Log.i(标记“--subscribe onNext=“+integer”);
}
私有流可观测getObserverPhoneState(){
返回可流动。创建(发射器->{
Log.i(标签“1”);
发射器.onNext(1);
Log.i(标签“2”);
发射器.onNext(2);
},背压调节(缓冲);
}
***logcat***
发射1
发射2
-----订阅onNext=1
-----订阅onNext=2
此代码生成一个错误:

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
private可流动getObservablePhoneState(){
返回可流动。创建(发射器->{
PhoneStateListener PhoneStateListener=新的PhoneStateListener(){
@凌驾
public void onCallStateChanged(int状态,字符串incomingNumber){
Log.i(标记“onCallStateChanged=“+state”);
发射器.onNext(州);
}
};
TelephonyManager TelephonyManager=(TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_服务);
listen(phoneStateListener,phoneStateListener.listen\u CALL\u STATE);
},背压调节(缓冲);
}
***logcat***
io.reactivex.exceptions.OnErrorNotImplementedException:
尝试从字段“android.os.MessageQueue”读取
空对象引用上的android.os.Looper.mQueue
与Observable.create()相同的错误。 也许这是因为


如何正确操作?

您应该删除
订阅(Schedulers.io())
以避免在不同的线程中创建
PhoneStateListener
,因为引擎盖下正在尝试使用MQUE为空的处理程序发送消息。就打电话

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

是否可能在活动中调用onCreate()之前的东西?我试过你的代码,它对我很好。Thx,你的评论很有用。代码起作用了。但是onNext只出现1-3次,而且没有出现。我在安卓8下测试,我使用的是最新版本的库。我将在稍后发布完整的测试代码。也许我选择了太复杂的侦听器。onNext被调用了1-3次,但您的侦听器被调用了更多次?侦听器已死亡,并且(当然)onNext。安卓4.2-一切正常。安卓8-:(本机监听器工作正常。此处的完整代码本机phoneStateListener()在任何地方都正常工作。在安卓4.2上,“Observable Listener”(Observable,Flowable)工作正常。在安卓8.0上,“Observable Listener”(Observable,Flowable)呼叫了2-3次并死亡。重现问题的步骤:-将电话号码设置为您自己的手机(是的,你会给自己打电话)-在Android 8上运行应用程序-通话-按断开连接(摘机)-如果你做得足够快-一切都会好的-如果你听到短嘟嘟声并等待,监听器会死掉并且不再反应。我不确定,但是,你是否尝试过将不同的状态传递给
listen
方法?检查8.0的更改日志API可能已经更改