AdMob Rewarded Ads Load but Never Show in Unity Android Build - Activity Lifecycle and Mediation Waterfall Fix - How to Fix
If your Unity Android logs say the rewarded ad loaded, but the ad never appears when you call show, you usually have a lifecycle or mediation-state mismatch.
This guide gives you a fast, repeatable fix path.
Problem
Typical symptoms:
OnAdLoadedcallback fires- no crash, but no ad UI appears
- reward callbacks never run
- issue reproduces more on resume, scene switch, or low-memory devices
Root Cause
In most projects this happens because one or more of these conditions are true:
Show()is called before the app returns to a valid foreground activity state- the ad object is stale after pause/resume or activity recreation
- mediation adapter is initialized late or not ready in the selected waterfall slot
- show call is triggered off the Unity main thread timing path
- preloading logic races with scene transitions and invalidates the loaded instance
Quick Fix Checklist
Run these first:
- initialize Mobile Ads SDK once at startup and wait for completion callback
- keep one rewarded instance per placement and replace it after every show attempt
- show ads only when app focus is true and Android activity is resumed
- verify all mediation adapters are present and version-aligned
- test with AdMob test IDs and adapter test mode before production IDs
Step-by-Step Fix
Step 1 - Gate show calls behind lifecycle-safe conditions
Only call Show() when all conditions are true:
- app is in foreground (
OnApplicationFocus(true)) - no scene transition is in progress
- rewarded instance is loaded and not yet consumed
If you trigger show from button press immediately after resume, defer one frame and re-check focus.
Step 2 - Recreate rewarded object after each show attempt
Treat rewarded ads as single-use objects.
After show success, show failure, or dismissal callback:
- null old reference
- create a fresh rewarded ad instance
- rebind callbacks
- request next load
This avoids “loaded but not showable” stale-object states.
Step 3 - Validate mediation waterfall readiness
In AdMob + mediation setups:
- open Ad Inspector on device
- check adapter status for each configured network
- confirm no adapter version mismatch
- verify placement is not blocked by consent or region policy
A loaded top-level ad callback can still fail to show if the selected waterfall candidate is not actually show-ready.
Official references:
Step 4 - Ensure show path executes on the correct runtime timing
If you bridge events through async tasks, restore control to Unity main gameplay flow before calling show.
Use one dedicated ad manager that serializes:
- load state updates
- readiness checks
- show requests
- post-show reload
Do not scatter Show() calls across multiple scene objects.
Step 5 - Harden pause/resume behavior on Android
On Android, activity changes can invalidate show timing.
When app resumes:
- re-check focus
- confirm current rewarded instance is still valid
- if uncertain, discard and preload fresh
- re-enable UI trigger only after load callback confirms ready
This prevents silent no-op shows after returning from background.
Verification
Use this validation loop:
- clear app data on test device
- run with test ad unit IDs
- load rewarded ad
- background app for 10-20 seconds, resume, then show
- repeat across 3 scene transitions
Pass criteria:
- ad UI appears on each valid show attempt
- dismissal callback fires
- reward callback fires exactly once
- next load starts immediately after dismissal
Alternative Fixes
If issue persists:
Alternative A - Disable mediation temporarily
Use pure AdMob test inventory only.
If show works, the issue is in adapter configuration, not core lifecycle flow.
Alternative B - Reduce initialization fan-out at startup
If many SDKs initialize together, delay non-essential SDK startup until after first rewarded preload.
Alternative C - Add show timeout fallback UX
If show does not start within a short timeout window, cancel and return control to player with a retry button.
Prevention Tips
- centralize ad state in one persistent manager object
- log load, show, dismiss, reward with build ID and scene name
- run one Android lifecycle regression test before each release
- keep mediation adapters updated in lockstep with Mobile Ads SDK version
- avoid manual duplicate initialization in multiple scenes
FAQ
Why does OnAdLoaded fire but ad still does not show
Load success only confirms inventory fetch, not that your runtime state is valid at show time.
Lifecycle or stale reference issues can still block display.
Should we preload multiple rewarded ads to avoid show failures
For most indie projects, one controlled instance per placement is safer.
Multi-instance preload adds race complexity unless you implement strict queue ownership.
Can consent flow block rewarded show even after load
Yes. Region-specific consent and privacy state can affect mediation eligibility and final show path.
Verify consent state and adapter status together in Ad Inspector.
Related Links
- AdMob Mediation Adapter Version Conflict in Unity Android - Gradle Dependency Resolution and Adapter Matrix Fix
- Ad Integration Not Working in Unity - Monetization Fixes
- Business & Monetization Help Articles
- Unity IAP Receipt Validation Fails on Google Play Billing 5+ - Plugin and Backend Fix
- Google Play 16 KB Memory Page Size Requirement Blocks Release - IL2CPP NDK and Gradle Packaging Fix
Bookmark this fix for your Android release checklist.
Share it with your team if rewarded ads are your primary progression or monetization gate.