-
Notifications
You must be signed in to change notification settings - Fork 4
NativeAdManager
The AdManageKit library (version v1.3.2) provides a robust native ads caching system in the com.i2hammad.admanagekit.admob package. This feature enables efficient ad delivery by caching native ads per ad unit ID, with a 1-hour expiration policy and a useCachedAd boolean option to choose between cached or new ads. It reduces network requests, improves ad load times, and ensures reliable ad display across NativeBannerSmall, NativeBannerMedium, and NativeLarge ad formats. The caching logic is centrally managed by the NativeAdManager class, shipped as part of the library.
Library Version: v1.3.2
Last Updated: May 22, 2025
-
Per-Ad-Unit Caching: Caches one
NativeAdperadUnitId, supporting multiple ad units with independent caches. - 1-Hour Ad Expiration: Cached ads expire after 1 hour (3600 seconds) to ensure freshness, with automatic cleanup of expired ads.
-
Boolean Control: The
useCachedAdparameter (default:false) allows developers to prioritize cached ads (if valid) or fetch new ones. -
Fallback Mechanism: If a new ad fails to load and
useCachedAdisfalse, a valid cached ad for the sameadUnitIdis served if available. - Memory Management: Automatically destroys old or expired ads to prevent memory leaks.
-
Unified Caching:
NativeAdManagerensures consistent caching behavior across all supported ad formats.
The NativeAdManager singleton, included in the v1.3.2 library, manages ad caching:
-
Key Methods:
-
setCachedNativeAd(adUnitId: String, ad: NativeAd): Stores aNativeAdfor the specifiedadUnitIdwith a timestamp. -
getCachedNativeAd(adUnitId: String): NativeAd?: Retrieves a cached ad if it exists and is not expired. -
clearCachedAd(adUnitId: String): Removes and destroys the cached ad for a specificadUnitId. -
clearAllCachedAds(): Clears and destroys all cached ads.
-
-
Configuration:
-
enableCachingNativeAds: Boolean: Globally enables or disables caching (default:true).
-
-
Expiration Logic:
- Ads older than 3600 seconds are destroyed and removed from the cache when accessed via
getCachedNativeAd.
- Ads older than 3600 seconds are destroyed and removed from the cache when accessed via
-
Storage:
- Uses a
MutableMap<String, CachedAd>whereCachedAdis an internal data class storing theNativeAdand its cache timestamp.
- Uses a
The library includes three ad format classes:
-
NativeBannerSmall: For small native banner ads. -
NativeBannerMedium: For medium native banner ads. -
NativeLarge: For large native ads with media content.
Each class supports:
- Loading ads with the
useCachedAdoption vialoadNativeBannerAd(NativeBannerSmall,NativeBannerMedium) orloadNativeAds(NativeLarge). - Displaying cached ads using
displayAd. - Fallback to cached ads on load failure.
- Integration with
NativeAdManagerfor caching and expiration.
Add AdManageKit v1.3.2 to your project via your build system (e.g., Gradle):
implementation 'com.i2hammad.admanagekit:admob:1.3.2'Ensure the following dependencies are included in your app:
- Google AdMob SDK
- Firebase Analytics (for event logging)
- Shimmer (for loading placeholders)
Use the loadNativeBannerAd or loadNativeAds method to load ads, specifying whether to use a cached ad.
// Initialize NativeBannerSmall
val nativeBannerSmall = NativeBannerSmall(context)
nativeBannerSmall.loadNativeBannerAd(
activity = activity,
adNativeBanner = "your-ad-unit-id",
useCachedAd = false, // Fetch new ad
adCallBack = object : AdLoadCallback {
override fun onAdLoaded() { Log.d("Ad", "Ad loaded") }
override fun onFailedToLoad(adError: LoadAdError) { Log.d("Ad", "Ad failed: ${adError.message}") }
override fun onAdImpression() { Log.d("Ad", "Ad impression") }
override fun onAdClicked() { Log.d("Ad", "Ad clicked") }
override fun onAdClosed() { Log.d("Ad", "Ad closed") }
override fun onAdOpened() { Log.d("Ad", "Ad opened") }
}
)
// Load cached ad if available and not expired
nativeBannerSmall.loadNativeBannerAd(activity, "your-ad-unit-id", useCachedAd = true)Control caching globally via NativeAdManager:
// Enable caching (default)
NativeAdManager.enableCachingNativeAds = true
// Disable caching
NativeAdManager.enableCachingNativeAds = falseClear cached ads to manage memory:
// Clear cache for a specific ad unit
NativeAdManager.clearCachedAd("your-ad-unit-id")
// Clear all cached ads
NativeAdManager.clearAllCachedAds()// NativeBannerMedium
val nativeBannerMedium = NativeBannerMedium(context)
nativeBannerMedium.loadNativeBannerAd(activity, "medium-ad-unit-id", useCachedAd = true)
// NativeLarge
val nativeLarge = NativeLarge(context)
nativeLarge.loadNativeAds(activity, "large-ad-unit-id", useCachedAd = false, object : AdLoadCallback {
override fun onAdLoaded() { Log.d("Ad", "Large Ad loaded") }
override fun onFailedToLoad(adError: LoadAdError) { Log.d("Ad", "Large Ad failed") }
override fun onAdImpression() { Log.d("Ad", "Large Ad impression") }
override fun onAdClicked() { Log.d("Ad", "Large Ad clicked") }
override fun onAdClosed() { Log.d("Ad", "Large Ad closed") }
override fun onAdOpened() { Log.d("Ad", "Large Ad opened") }
})-
Ad Loading:
- If
useCachedAdistrueand a valid cached ad exists (viaNativeAdManager.getCachedNativeAd(adUnitId)), it is displayed usingdisplayAd. - Otherwise, a new ad is fetched using
AdLoader. - On successful load, the ad is cached via
NativeAdManager.setCachedNativeAd(adUnitId, nativeAd)ifenableCachingNativeAdsistrue.
- If
-
Expiration Check:
-
getCachedNativeAdchecks the ad’s age. If older than 3600 seconds, the ad is destroyed, removed from the cache, andnullis returned.
-
-
Fallback Logic:
- If a new ad fails to load and
useCachedAdisfalse, a valid cached ad is served before triggeringonFailedToLoad.
- If a new ad fails to load and
-
Memory Management:
- Old ads are destroyed when replaced or expired.
-
clearAllCachedAdsensures all ads are destroyed during cleanup.
package com.i2hammad.admanagekit.admob
object NativeAdManager {
var enableCachingNativeAds: Boolean = true
private data class CachedAd(val ad: NativeAd, val cachedTime: Long)
private val cachedAds: MutableMap<String, CachedAd> = mutableMapOf()
fun setCachedNativeAd(adUnitId: String, ad: NativeAd) {
if (enableCachingNativeAds) {
cachedAds[adUnitId]?.ad?.destroy()
cachedAds[adUnitId] = CachedAd(ad, System.currentTimeMillis())
}
}
fun getCachedNativeAd(adUnitId: String): NativeAd? {
if (!enableCachingNativeAds) return null
val cachedAd = cachedAds[adUnitId] ?: return null
val adAgeSeconds = (System.currentTimeMillis() - cachedAd.cachedTime) / 1000
return if (adAgeSeconds <= 3600) cachedAd.ad else {
cachedAd.ad.destroy()
cachedAds.remove(adUnitId)
null
}
}
}fun loadAd(context: Context, adUnitId: String, useCachedAd: Boolean, callback: AdLoadCallback?) {
this.adUnitId = adUnitId
if (useCachedAd && NativeAdManager.enableCachingNativeAds) {
val cachedAd = NativeAdManager.getCachedNativeAd(adUnitId)
if (cachedAd != null) {
displayAd(cachedAd)
callback?.onAdLoaded()
return
}
}
// Proceed to load new ad
}-
Thread Safety: For concurrent ad loading, make
NativeAdManager.cachedAdsthread-safe:private val cachedAds: MutableMap<String, CachedAd> = Collections.synchronizedMap(mutableMapOf())
-
Lifecycle Management: Call
NativeAdManager.clearAllCachedAds()inActivity.onDestroyorApplication.onTerminateto free resources. -
Testing:
- Test ad expiration by waiting past 1 hour.
- Verify fallback behavior when new ads fail.
- Test multiple
adUnitIdvalues for per-ad-unit caching. - Toggle
useCachedAdandenableCachingNativeAds.
-
Logging: Enable verbose logging (via
Log.d) to debug caching and expiration issues. - Ad Provider Compliance: Check AdMob policies for caching and expiration constraints.
-
Manual Expiration: The 1-hour expiration is managed manually, as
NativeAdlacks built-in expiration metadata. -
Single Ad per Unit: Only one ad is cached per
adUnitId. For multiple ads, extendNativeAdManager. - No Auto-Refresh: Apps must manually request new ads when needed.
- Google AdMob SDK: For ad loading and rendering.
- Firebase Analytics: For logging ad events (impressions, paid events, failures).
- Shimmer: For loading placeholders.
-
Project Resources: Layouts (
layout_native_banner_small,layout_native_banner_medium,layout_native_large),BillingConfig,AdManager.
-
Cached Ad Not Displaying: Ensure
enableCachingNativeAdsistrueand the ad is not expired. -
Memory Leaks: Call
clearAllCachedAdsduring app cleanup. -
Ad Load Failures: Verify
adUnitId, network connectivity, and AdMob configuration. -
AdChoices Issues: Ensure
adChoicesViewis defined in layout files and properly handled.
- Support for multiple cached ads per
adUnitId. - Configurable expiration durations.
- Automatic cache refresh based on app-specific policies.
- Enhanced analytics for cache hit/miss rates.
AdManageKit v3.3.4 | GitHub | API Docs | Report Issue | Buy me a coffee