在native层回调子线程刷新UI无效

本文探讨了Activity1跳转到Activity2时,在Activity2中初始化native层回调导致的UI刷新问题。具体表现为首次进入Activity2时能正确刷新UI,但再次进入时刷新失效。通过分析发现原因是native层使用了过期的全局引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity1跳转到Activity2,在Activity2初始化native层回调,第一次进入回调能刷新UI,点返回键回到Activity1,再进入Activity2,进入回调刷新UI就无效了。除了刷新UI组件,调用其他方法都很正常。

第一次打开Activity有效

08-02 13:40:02.308 17224-17224/ pb=android.widget.ProgressBar{a30f7f3 V.ED..... ........ 0,0-144,144 #7f080073 app:id/pb}

第二次打开无效

08-02 13:40:25.996 17224-17224/  pb=android.widget.ProgressBar{29b85d0 G.ED..... ......I. 0,0-0,0 #7f080073 app:id/pb}

因为在native层调用回到JAVA之后,获取到的变量是错的!值都是0。。。

什么方法都试过了,发送消息、native层直接调用回调等等。

最后方法,弱引用handler,猜测是内存泄露了。

用outer调用UI组件无效。
用mInstance调用UI组件有效。

找到原因了,关键还是native调用了旧的全局引用。之前没问题是因为在onDestroy调用了DeleteGlobalRef释放全局引用。

可能的解决办法:
- A 每次setCallback就保存一次全局引用。
- B 每次传对象都传同一个。

这个全局引用到底引用了什么?

结果
A方法可以,B方法不行。

结论

每次打开Activity都要重新获取全局引用NewGlobalRef。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值