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 —> 子线程请求接口

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐