Android Fragment接入锚定自适应横幅广告 返回后不显示问题
Fragment返回后锚定自适应横幅广告不显示问题排查方案
优先排查生命周期绑定错误(单Activity+Navigation架构90%的此类问题都是这个原因)
Navigation组件切换Fragment时,退到后台的Fragment只会触发onDestroyView销毁视图层级,不会触发onDestroy销毁Fragment实例,直到该Fragment被彻底移出返回栈。你当前的AdView生命周期写法完全不匹配这个特性:
- 把
adView.destroy()写在onDestroy里,会导致Fragment切走时,绑定了已废弃视图的AdView实例不会被销毁,残留实例会和返回时新建的AdView冲突 - 没有在视图销毁时把AdView从父布局移除、清空引用,会导致内存泄漏,同时新的AdView无法正确挂载到视图树
直接替换生命周期代码为如下实现:
private var adView: AdView? = null override fun onPause() { adView?.pause() super.onPause() } override fun onResume() { super.onResume() adView?.resume() } override fun onDestroyView() { // 移除AdView并销毁,释放资源 (adView?.parent as? ViewGroup)?.removeView(adView) adView?.destroy() adView = null // 同步清空ViewBinding引用,避免内存泄漏 _binding = null super.onDestroyView() } override fun onDestroy() { // 移除原有写在这里的adView.destroy()逻辑,这里不需要处理AdView super.onDestroy() }
检查setupAdview实现逻辑
- 每次
onCreateView调用setupAdview时,必须新建AdView实例,严禁复用绑定过旧视图的AdView对象 - 锚定自适应广告的宽度计算必须基于当前inflate出来的最新View布局参数,不要缓存历史宽度值,否则会因为View未完成测量拿到宽度0,导致广告请求非法
- 确认AdView在创建后被正确add到指定的广告容器布局中,不要遗漏addView步骤
定位具体加载失败原因
以上修改后如果仍不显示,给AdView绑定加载回调,通过onAdFailedToLoad返回的错误码直接定位原因:
ERROR_CODE_NO_FILL:当前无匹配的广告填充,属于正常情况,切换测试广告位、等待一段时间重试即可ERROR_CODE_INVALID_REQUEST:请求参数非法,检查广告位ID是否正确、广告尺寸是否大于0、AdView是否已挂载到视图树ERROR_CODE_NETWORK_ERROR:网络异常,检查返回页面时的网络状态,触发重试即可ERROR_CODE_INTERNAL_ERROR:SDK内部异常,升级到最新版Mobile Ads SDK后重试
内容的提问来源于stack exchange,提问作者DeKekem
相关产品推荐
相关产品推荐

