大坑一个

需求简单介绍:
提供一个简单的组件,给各个频道使用,其中频道分为原生频道以及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没有效果。回头再看。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 第一章:Activity生命周期和启动模式 Activity关闭时会调用onPause()和onStop(),如果...
    loneyzhou阅读 4,531评论 0 2
  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 10,644评论 2 54
  • 面试必背 会舍弃、总结概括——根据我这些年面试和看面试题搜集过来的知识点汇总而来 建议根据我的写的面试应对思路中的...
    luoyangzk阅读 11,882评论 6 173
  • 钱钟书先生说婚姻是围城,其实我觉得我们不管身处何种环境都是围城,都处于那种“里面的人想出去,外面的人想进来”的状态...
    zhaokeke阅读 3,616评论 5 3

友情链接更多精彩内容