Android bug 记录 java.lang.IllegalStateException: Method addObserver must be called on the main thread

Android bug 记录 java.lang.IllegalStateException: Method addObserver must be called on the main thread


最近开发遇见一个问题,特此记录一下。
具体报错如下:

java.lang.IllegalStateException: Method addObserver must be called on the main thread
  at androidx.lifecycle.LifecycleRegistry.enforceMainThreadIfNeeded(LifecycleRegistry.java:317)
  at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:172)

首先放出排查结果:原因是有个接口在子线程调用导致!!!
就像下面这样:

	Runnable runnable = new Runnable() {
            @Override
            public void run() {
            	...
            	...
            	Http请求
            }
           };
   		Thread thread = new Thread(runnable);
        thread.start();

这个功能以前是没问题的,直到最近突然出现。定位代码:

private Observable<String> bindToLifecycle(LifecycleOwner owner, Observable<String> observable) {
        owner.getLifecycle().addObserver(this);
        observable = observable.compose(AndroidLifecycle.createLifecycleProvider(owner).<String>bindToLifecycle());
        return observable;
    }

继续追踪到LifecycleRegistry:

全局搜索enforceMainThreadIfNeeded:

没有?
发现还有一个版本:

换版本继续:

异常抛出的地方:

异常原因:

官网androidx.lifecycle:lifecycle-runtime:2.3.0更新日志:

以前版本是2.2.0 ,现在莫名奇妙升到2.3.1于是就出问题了
问题找到了也容易解决,但是引起原因却没找到,为啥会有2.3.1版本在项目中?
我们的项目是原生和flutter混编,原生代码里没有找到直接引用lifecycle2.3.1的,那flutter呢?
于是我换个思路,找找看是不是其他包引用了。
最后定位到appcompat-1.3.0。官网更新日志:

搜索androidx.appcompat:appcompat,定位到flutter包photo_manager,再找到flutter图片选择库:
wechat_assets_picker !!!

最终这个问题完整排查链出来了:
wechat_assets_picker —> photo_manager —> androidx.appcompat:appcompat:1.3.0
—> androidx.lifecycle:lifecycle-runtime:2.3.1 —> 子线程请求接口

花了近两个小时,搞定收工!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪枫轻语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值