gpt4 book ai didi

android - 将异步监听器转换/包装为 Observable (RxJava2)

转载 作者:太空宇宙 更新时间:2023-11-03 13:43:51 24 4
gpt4 key购买 nike

我想为 Observable 对象包装一个真正的监听器。对于初学者来说,这是一个测试用例,对他来说一切都很好。

@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

这段代码会产生一个错误:

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() 一样的错误。也许这是因为 RxJava2 does not support emitting a null value .

如何做对?

最佳答案

您应该删除 subscribeOn(Schedulers.io()) 以避免在不同的线程中创建 PhoneStateListener,因为在后台尝试使用mQueue 为空的处理程序。打电话

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

关于android - 将异步监听器转换/包装为 Observable (RxJava2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46332016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com