1. 分析
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方法不行。
2. 结论
每次打开Activity都要重新获取全局引用NewGlobalRef。