polyv / polyv-rn-vod-sdk-demo

React Native 点播demo工程
9 stars 6 forks source link

我正在开发RN Package,需要的关注➕ #26

Open yaaliuzhipeng opened 2 years ago

yaaliuzhipeng commented 2 years ago

当前会提供Bridge版package,后续RN新架构turbomodule和fabric文档出正式版后会迁移至新架构。需要使用到点播客户端的可以关注我的GitHub主页,会持续更新

hanwenbo commented 2 years ago

WrapperView会存在一个问题,当使用场景存在创建、立即销毁(比如进入到新路由 立马退出路由),那么你将无法释放,因为你的dispatch_async(uiManager.methodQueue,是异步,只要操作够快,就会有错误。 我觉得您可以提供几个方法: 1.正在播放的视频列表(因为你用的wrapperView的id去作为一个索引,我不知道怎么拓展) 2.销毁所有存在在后台的视频

这样开发者还可以有退路,主动销毁存在后台的视频,现在是存在错误想销毁都不行,因为Wrapper的View在RN上已经不存在了

yaaliuzhipeng commented 2 years ago

WrapperView会存在一个问题,当使用场景存在创建、立即销毁(比如进入到新路由 立马退出路由),那么你将无法释放,因为你的dispatch_async(uiManager.methodQueue,是异步,只要操作够快,就会有错误。 我觉得您可以提供几个方法: 1.正在播放的视频列表(因为你用的wrapperView的id去作为一个索引,我不知道怎么拓展) 2.销毁所有存在在后台的视频

这样开发者还可以有退路,主动销毁存在后台的视频,现在是存在错误想销毁都不行,因为Wrapper的View在RN上已经不存在了

iOS端可以重写WrapperView的removeFromSuperview、在里面对player实例进行销毁,这样当导出的view被unmount后就会触发removeFromSuperview从而实现自动销毁实例。Android端我还没适配、理论也有对应的方法可以实现。 代码目前还在项目中、等项目上线后我再抽出代码到单独package里传到GitHub

yaaliuzhipeng commented 2 years ago

这里建议pause即可;保利威的播放器本身就是单例,没必要重复销毁创建、造成多余的性能消耗; Android端

    @Override
    public void onViewRemoved(View child) {
        player.pause();
        //player.destroy(); //可选
        super.onViewRemoved(child);
    }

iOS端

- (void)removeFromSuperview
{
  [_player pause];
  //[_player destroy]; //可选
  [super removeFromSuperview];
}
hanwenbo commented 2 years ago

@yaaliuzhipeng 感谢啊 确实好使 有道理暂停也行哈,因为是个view,作为用户来说,我以为是bug 所以就想到怎么销毁它 ok 如果是单例这种操作的话 我就理解你们的思路了 我需要改下代码 也不用销毁了

hanwenbo commented 2 years ago

@yaaliuzhipeng 今天比之前操作更快 、网络不好的情况下,去用单例+ pause 测试 还是会遇到问题,因为操作太快, ref就不能正常调用

yaaliuzhipeng commented 2 years ago

@yaaliuzhipeng 今天比之前操作更快 、网络不好的情况下,去用单例+ pause 测试 还是会遇到问题,因为操作太快, ref就不能正常调用

不要用js端的pause去暂停,都是异步操作,所以会出现你说的情况。按我上面说的、改原生代码里的wrapperview。

hanwenbo commented 2 years ago

@yaaliuzhipeng 我擦 你这回复真快 ,是的 ,我现在又改回removeFromSuperview了 比较稳定,没再复现,如果想走通你说的单例pause 那得暴露个全局的方法去操作了 不然ref反应慢一点 组件被销毁 就执行不到原生了

yaaliuzhipeng commented 2 years ago

@yaaliuzhipeng 我擦 你这回复真快 ,是的 ,我现在又改回removeFromSuperview了 比较稳定,没再复现,如果想走通你说的单例pause 那得暴露个全局的方法去操作了 不然ref反应慢一点 组件被销毁 就执行不到原生了

可以在导出的module中全局初始化一个单例类的实例,player创建后存到这个单例类中去,这样就可以从导出的模块里对应的方法控制player了。不过还是建议直接在原生代码中控制播放器的状态,比如view移除时自动销毁播放器实例或暂停⏸️。想在js端进行原生相关实例的状态控制、得用RN新架构fabric和turbo module,但是目前兼容性还不好,没办法直接上fabric。

hanwenbo commented 2 years ago
image

@yaaliuzhipeng 奇怪 今天我可能网太差 removeFromSuperview ,操作过快,依然杀不掉 ,除非我操作慢一点

hanwenbo commented 2 years ago

@yaaliuzhipeng fabric和turbo module 体验怎么样啊 我关注这个都6年了 还没上线

yaaliuzhipeng commented 2 years ago
image

@yaaliuzhipeng 奇怪 今天我可能网太差 removeFromSuperview ,操作过快,依然杀不掉 ,除非我操作慢一点

那就用destroy吧,官方的这个package我没看。晚点我把我自己写的传到主页上,你拉下来试试看行不行。

yaaliuzhipeng commented 2 years ago

@yaaliuzhipeng fabric和turbo module 体验怎么样啊 我关注这个都6年了 还没上线

写起来比较繁琐,我只稍深度研究过jsi, turbomodule和fabric还没怎么试过。react-native-gesture-handler都还没兼容fabric,所以我就没研究了。

hanwenbo commented 2 years ago
image

@yaaliuzhipeng 奇怪 今天我可能网太差 removeFromSuperview ,操作过快,依然杀不掉 ,除非我操作慢一点

那就用destroy吧,官方的这个package我没看。晚点我把我自己写的传到主页上,你拉下来试试看行不行。

@yaaliuzhipeng 好 你上传了我可以试试 给你反馈

hanwenbo commented 2 years ago

@yaaliuzhipeng fabric和turbo module 体验怎么样啊 我关注这个都6年了 还没上线

写起来比较繁琐,我只稍深度研究过jsi, turbomodule和fabric还没怎么试过。react-native-gesture-handler都还没兼容fabric,所以我就没研究了。

要是fabric上线了 那挺无敌的 性能提升一大截 我理解也不用这么异步调用原生了

hanwenbo commented 2 years ago

@yaaliuzhipeng 这个人写的安卓你能跑起来吗?我拉他的库都是无法存在

hanwenbo commented 2 years ago

改了大量他安卓代码 ,解决了 ,这位安卓开发者做的rn库 bug是真多

yaaliuzhipeng commented 2 years ago

改了大量他安卓代码 ,解决了 ,这位安卓开发者做的rn库 bug是真多

不好意思兄弟,放了你鸽子。那天晚上我试了下把项目里代码单独抽出到library里,但是gradle拉取一直有问题,我直接在现在开发的项目里经过修复后的gradle是可以正常拉取相关依赖下来。最近实在比较忙,就没继续弄了。你之前说的那个暂停还是没用,我觉得最大的可能是你有在JS端进行了“播放”的调用,导致视图销毁时的暂停触发时机先于了“播放”,然后就出现了继续播放的问题。

hanwenbo commented 2 years ago

@yaaliuzhipeng 嗯嗯没事 我最后在原生里 view卸载 播放器也卸载算是应急解决了 安卓也正常跑起来 谢谢啊 官方这个库 估计是太久了 直接是跑不起来的 ios和安卓都需要改源码