You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:36:03