Haber feed'leri veya sosyal feed'ler gibi uzun ya da sonsuz kaydırma listelerinde her öğe konumu için banner reklam oluşturmak yüksek bellek tüketimine ve kullanıcı arayüzünde gecikmeye neden olabilir. Performansı artırmak için BannerAd örneklerinin küçük ve sabit boyutlu bir önbelleğini korumak ve kullanıcı kaydırdıkça ekran dışındaki reklamları yeniden kullanmak üzere banner geri dönüşümünü kullanın.
Bu sayfada, reklam önbelleğinin boyutlandırılması, bir BannerAd örneğinin ekran dışında olup olmadığının kontrol edilmesi ve önbelleğe alınmış reklamların liste konumlarına yeniden atanması ele alınmaktadır.
Aşağıdaki resimde, ekran dışı banner reklamın önbelleğe nasıl döndüğü ve kullanıcı kaydırma yaparken liste konumunda nasıl yeniden kullanıldığı gösterilmektedir:
Ön koşullar
Devam etmeden önce kaydırılan banner'lar için satır içi uyarlanabilir banner kullanın.
Atanan liste konumlarını izleme
Kullanıcınız kaydırdıkça banner geri dönüşümü, sınırlı sayıda BannerAd
örneği bellekte tutar ve bu örnekleri liste konumları arasında taşır.
Hangi reklamın yeniden kullanılacağını öğrenmek için önbellekteki her reklamın hangi liste konumunda olduğunu takip edin.
Widget'ınızda aşağıdaki durumu koruyun:
BannerAdörneğin sabit boyutlu önbelleği. Önbellek için ayarladığınız boyut, aynı anda bellekte tutulan maksimum reklam sayısıdır.- Reklamın listede ne sıklıkta görüneceğini belirleyen reklam aralığı.
- Her
BannerAdörneğini, örneğin bulunduğu liste konumuyla ilişkilendiren bir konumMapsınıfı. Bir reklamı geri dönüştürdüğünüzde, buMapsınıfındaki girişi en son konumu gösterecek şekilde güncelleyin. - Yüklenen her reklam için platform tarafından çözümlenen
AdSizenesnesini depolayan bir boyutMapsınıfı. Reklam yüklendikten sonra satır içi uyarlanabilir banner yükseklikleri bilinir.
Aşağıdaki örnekte, önbellekteki her reklam için atanan liste konumları izlenmektedir:
// Maximum number of banner ad instances kept in the cache.
static const int _cacheSize = 8;
// Spacing between banner ads. For example, index 0, 6, 12, and so on
// display ads.
static const int _adInterval = 6;
// The cache of allocated BannerAd instances.
final List<BannerAd> _banners = [];
// Maps each BannerAd instance to its currently assigned list item position.
final Map<BannerAd, int> _bannerPositions = {};
// Stores the platform-resolved size of each loaded banner ad.
final Map<BannerAd, AdSize> _bannerSizes = {};
Önbellek boyutu seçme
Önbelleği, ekranda aynı anda görünebilecek maksimum reklam sayısından daha büyük yapın. Önbellek bu boyuttan küçükse geri dönüşüm için seçilen reklam genellikle görünür olmaya devam eder ve uygulamanız reklamları yeniden kullanmak yerine ek reklamlar ayırır.
Boyut seçmek için aşağıdakileri yapın:
- Görüntü alanı yüksekliğini bir reklam aralığının yüksekliğine bölerek ekrana aynı anda kaç reklamın sığacağını tahmin edin.
- Hızlı kaydırma sırasında ayrılmaya devam eden reklamlar için alan ekleyin.
- Geri dönüşüm için seçilen reklamların ekranda kalmaya devam ettiğini görürseniz önbellek boyutunu artırın.
Bu sayfadaki örnekte, her altı satırda bir reklam gösteriliyor ve sekiz öğelik bir önbellek kullanılıyor. Bu örnek, ekranda aynı anda görünen birkaç reklam için yer bırakır.
Bir reklamın ekranda olup olmadığını kontrol etme
Platform görünümlerini oluşturan tüm Google Mobile Ads Flutter Plugin sınıfları, AdWithView sınıfını uygular ve isMounted alıcısı sağlar. Önbelleğe alınmış bir reklamı liste konumuna yeniden atamadan önce, reklamın ekran dışında kaydırıldığını ve yeniden kullanmanın güvenli olduğunu onaylamak için isMounted getter'ı kontrol edin.
Banner reklamı alma ve yeniden kullanma
Liste, belirli bir konum için banner istediğinde aşağıdakileri yapın:
- Bu konuma atanmış bir reklam varsa onu yeniden kullanın.
- Önbellek dolu değilse reklam isteğinde bulunun.
- Önbellek doluysa önbelleğe alınmış bir reklam seçin ve reklamı yeniden atamadan önce
isMountedalıcısınınfalsedeğeri olduğunu doğrulayın. - Widget, widget ağacından kaldırıldığında önbellekteki her reklamda
dispose()yöntemini çağırın.
Aşağıdaki örnekte bir banner reklam alınır ve geri dönüştürülür:
BannerAd _getRecycledBannerAd(BuildContext context, int bannerPosition) {
// 1. If an ad is already mapped to this position, reuse it.
final BannerAd? existingBanner = _bannerPositions.entries
.firstWhereOrNull((entry) => entry.value == bannerPosition)
?.key;
if (existingBanner != null) {
return existingBanner;
}
// 2. If the cache is not full, allocate a new ad instance.
if (_banners.length < _cacheSize) {
final BannerAd newBanner = _createBannerAd(context);
_banners.add(newBanner);
_bannerPositions[newBanner] = bannerPosition;
return newBanner;
}
// 3. Select an existing ad from the cache using modulo arithmetic.
final BannerAd targetBanner = _banners[bannerPosition % _cacheSize];
// 4. Verify the ad is detached from the screen before recycling.
if (targetBanner.isMounted) {
// If still on screen during fast scrolls, allocate a temporary instance.
return _createBannerAd(context);
} else {
// Safe to reuse: reassign to the new position.
_bannerPositions[targetBanner] = bannerPosition;
return targetBanner;
}
}
Tam örnek için Google Mobile Ads Flutter Plugin örneğine bakın.