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

本文链接:https://www.jianshu.com/p/0d94ce0b8555

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。

你可能感兴趣的:(在native层回调子线程刷新UI无效)