FirebaseUI-Android中FirestorePagingAdapter的InterruptedException应在哪里捕获
问题根因
- 这个崩溃是低版本FirebaseUI-Android的FirestorePagingSource内部实现缺陷导致的:它在调用
Tasks.await()阻塞等待Firestore查询结果时,没有捕获分页任务取消时抛出的InterruptedException,也没有判断当前流是否已经被dispose就直接把异常抛出,导致RxJava找不到消费者投递错误,触发UndeliverableException崩溃。 - 触发场景通常是用户快速退出页面、或者分页请求还没返回就触发了刷新/加载更多取消,这时候后台线程被中断抛出异常,刚好库没有做对应处理。
解决方案
分两个优先级处理:
1. 优先升级FirebaseUI版本
v8.0.0及以上的FirebaseUI版本已经修复了这个问题,官方在FirestorePagingSource内部增加了异常判断,取消状态下的InterruptedException不会再向外抛出,升级依赖即可解决,不需要修改业务代码。
2. 暂时无法升级的临时修复方案
如果因为兼容问题暂时不能升级依赖,直接在Application初始化的时候设置RxJava全局错误拦截器,过滤掉这类无意义的取消异常即可:
RxJavaPlugins.setErrorHandler(e -> { if (e instanceof UndeliverableException) { e = e.getCause(); } // 过滤分页取消导致的中断异常 if (e instanceof InterruptedException) { // 这类是任务取消的正常异常,直接忽略即可 return; } // 其他异常保留原有处理逻辑,比如上报到Crashlytics Thread.currentThread().getUncaughtExceptionHandler() .uncaughtException(Thread.currentThread(), e); });
注意:这个拦截器是全局生效的,不要把所有异常都吞掉,只过滤你确认是正常取消导致的异常即可。
不需要修改现有适配器初始化代码
你当前的FirestorePagingAdapter初始化逻辑没有问题,不需要在业务层加额外的try-catch,因为异常是从库的后台线程抛出来的,业务层也捕获不到。
内容的提问来源于stack exchange,提问作者Marceh
相关产品推荐
相关产品推荐

