需求简单介绍:
提供一个简单的组件,给各个频道使用,其中频道分为原生频道以及RN频道。这个组件的展示逻辑是,先请求一个接口,如果接口返回了数据再去展示。
之前逻辑:
自定义一个ViewGroup,然后创建一个组件ImageView,在接口返回数据之后,通过post(new Runnable)方式去addView(imageView),因为我们访问接口时是在子线程的,所以返回的数据也在子线程,不能直接访问addView。
问题:
原生频道通过new和布局中引用我这个自定义组件都是没有问题的可以正常显示。但是,坑来了,通过ViewManager桥接给RN频道使用时这个imageView总是不显示。
思考方式:
1.首先抓包看接口有没有返回数据,发现接口正常。
2.断点查看是否addView了,addView走了,没有问题。这里坑来了,就是断点放过之后发现imageview显示了,所以我这里就开始怀疑是时间的问题了,需要延时处理,所以子线程post改成postDelay了,结果发现有时候可行有时候不可行。
3.通过Android Tools Layout Inspector查看布局,发现只有自定义的ViewGroup,没有ImageView,这里说明imageView肯定没有add成功了,但是断点的确addView成功了,并且通过执行viewgroup.getChildAt(0)可以拿到imageView。关键的坑又来了,就是打log发现post里总是不执行,断点可以进去。问了同事,同事也没发现啥异常,周日的晚上困得要死,也就没深究。
4.试着将addView从接口中移除来,发现没有问题。
5.上网搜索一下,post不执行,发现了https://www.cnblogs.com/plokmju/p/7481727.html这篇文章,所以猜测是onAttachToWindow还没有执行就调用了addView,所以导致失败。这里说一下,为什么会出现这种情况,就是我们桥接了一个属性给RN,当RN组件加载时,就会调用我们桥接的这个方法,这个方法调用原生的接口请求去addView。那么就有可能出现我们这个组件还没挂在到RN(onAttachToWindow)上,就调用了接口,也就是addView比onAttachToWindow提前。
6.经过验证发现的确是onAttachToWindow没有调用导致,所以将接口请求放到onAttachToWindow中,就没有问题了。
中间当然还有一些别的猜测。
遗留问题:待看。
就是在子线程通过post addView没有效果。回头再看。