Android中Observable.takeLast引发NPE问题排查求助
问题描述
我定义了如下RxJava的BehaviorSubject:
companion object { var isLocationToolActive: BehaviorSubject<Boolean> = BehaviorSubject.createDefault(false) var isAoIToolActive: BehaviorSubject<Boolean> = BehaviorSubject.createDefault(false) var pointToPosition: BehaviorSubject<GeoPoint> = BehaviorSubject.createDefault(GeoPoint(0.0, 0.0)) } init { pointToPosition.subscribe { // 该行抛出异常 // 一些代码 } }
运行时抛出空指针异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'io.reactivex.Observable io.reactivex.Observable.takeLast(long, java.util.concurrent.TimeUnit, io.reactivex.Scheduler, boolean, int)' on a null object reference at io.reactivex.Observable.takeLast(Observable.java:11258) at <上述代码行>
已尝试的操作均未解决问题:
- 将Subject移出companion object
- 在subscribe前调用onNext()
- 修改subscribe逻辑
- 将subscribe移出init()
- 注释所有调用pointToPosition的代码
补充:问题仅出现在特定设备,三星Galaxy Tab S2 (SM-T713)崩溃,同系列SM-T710及新款Galaxy Tab A8可正常运行。
可能的解决方案
- 统一RxJava版本并适配旧系统:SM-T713的Android版本通常偏旧(多为7.0/8.0),当前RxJava版本可能在旧系统存在初始化bug。尝试降级至RxJava 2.2.x稳定版,或升级到兼容旧系统的最新版本,避免新版本API要求超出设备系统支持范围。
- 修复混淆配置:若开启代码混淆,可能是RxJava核心类被错误混淆导致空指针。在proguard规则中添加保护:
-keep class io.reactivex.** { *; } -keep interface io.reactivex.** { *; } -keepclassmembers class io.reactivex.** { *; } - 延迟初始化Subject:避免在companion object或init块中过早初始化,改用lazy懒加载确保初始化顺序正确:
companion object { val isLocationToolActive by lazy { BehaviorSubject.createDefault(false) } val isAoIToolActive by lazy { BehaviorSubject.createDefault(false) } val pointToPosition by lazy { BehaviorSubject.createDefault(GeoPoint(0.0, 0.0)) } } - 排查依赖冲突:执行
./gradlew app:dependencies查看依赖树,排除项目中重复或冲突的RxJava相关依赖,统一版本。 - 验证GeoPoint初始化:旧设备可能存在构造函数隐性问题,尝试提前初始化GeoPoint再传入:
private val defaultGeoPoint = GeoPoint(0.0, 0.0) val pointToPosition by lazy { BehaviorSubject.createDefault(defaultGeoPoint) }
内容的提问来源于stack exchange,提问作者kristyna
相关产品推荐
相关产品推荐

