إعادة استخدام إعلانات البانر في الخلاصات القابلة للتمرير

في القوائم الطويلة أو التي يمكن التمرير فيها بلا حدود، مثل خلاصات الأخبار أو خلاصات وسائل التواصل الاجتماعي، يمكن أن يؤدي إنشاء إعلان بانر لكل موضع عنصر إلى زيادة استهلاك الذاكرة وتأخُّر واجهة المستخدم. لتحسين الأداء، استخدِم ميزة إعادة استخدام البانر للحفاظ على ذاكرة التخزين المؤقت صغيرة وثابتة الحجم تتضمّن مثيلات BannerAd وإعادة استخدام الإعلانات خارج الشاشة أثناء تنقّل المستخدم.

تتناول هذه الصفحة تحديد حجم ذاكرة التخزين المؤقت للإعلانات، والتحقّق مما إذا كان مثيل BannerAd خارج الشاشة، وإعادة تعيين الإعلانات المخزَّنة مؤقتًا إلى مواضع القائمة.

تعرض الصورة التالية كيف يعود إعلان بانر خارج الشاشة إلى ذاكرة التخزين المؤقت ويتم إعادة استخدامه في موضع ضمن القائمة أثناء تنقّل المستخدم:

مخطّط بياني يعرض إعلان بانر يتم تمريره خارج الشاشة إلى ذاكرة التخزين المؤقت للإعلانات وإعادة استخدامه في أسفل الخلاصة المعروضة على الشاشة

المتطلبات الأساسية

قبل المتابعة، استخدِم "إعلانات البانر التكيّفية المضمّنة" لإعلانات البانر القابلة للتمرير.

تتبُّع مواضع القوائم المحدّدة

أثناء تنقّل المستخدم، تحتفظ ميزة إعادة استخدام البانر بعدد محدود من مثيلات BannerAd في الذاكرة وتنقل هذه المثيلات بين مواضع القائمة.

لمعرفة الإعلان الذي يجب إعادة استخدامه، تتبَّع موضع القائمة الذي يشغله كل إعلان في ذاكرة التخزين المؤقت.

الحفاظ على الحالة التالية في التطبيق المصغّر:

  • ذاكرة تخزين مؤقت ثابتة الحجم تحتوي على BannerAd مثيل. الحجم الذي ضبطت ذاكرة التخزين المؤقت عليه هو الحدّ الأقصى لعدد الإعلانات التي يتم الاحتفاظ بها في الذاكرة في وقت واحد.
  • فاصل زمني للإعلان يحدّد معدّل ظهور الإعلان في القائمة.
  • فئة الموضع Map التي تربط كل مثيل BannerAd بموضع القائمة الذي يشغله المثيل. عند إعادة استخدام إعلان، عدِّل الإدخال في فئة Map هذه للإشارة إلى الموضع الأخير.
  • فئة الحجم Map التي تخزّن العنصر AdSize الذي تم تحديده على مستوى النظام الأساسي لكل إعلان تم تحميله. بعد تحميل الإعلان، يصبح ارتفاع "إعلانات البانر التكيُّفية" المضمّنة معروفًا.

يتتبّع المثال التالي مواضع القائمة المخصّصة لكل إعلان في ذاكرة التخزين المؤقت:

// 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 = {};

اختيار حجم ذاكرة التخزين المؤقت

اجعل حجم ذاكرة التخزين المؤقت أكبر من الحد الأقصى لعدد الإعلانات التي يمكن أن تظهر على الشاشة في الوقت نفسه. إذا كان حجم ذاكرة التخزين المؤقت أصغر من هذا الحجم، سيظل الإعلان الذي تم اختياره لإعادة الاستخدام مرئيًا في أغلب الأحيان، وسيخصّص تطبيقك إعلانات إضافية بدلاً من إعادة استخدام الإعلانات.

لاختيار حجم، اتّبِع الخطوات التالية:

  1. قدِّر عدد الإعلانات التي يمكن عرضها على الشاشة في الوقت نفسه من خلال قسمة ارتفاع إطار العرض على ارتفاع فاصل إعلاني واحد.
  2. إضافة مساحة للإعلانات التي لا تزال في طور الفصل أثناء التمرير السريع
  3. إذا لاحظت أنّ الإعلانات التي تم اختيارها لإعادة الاستخدام لا تزال تظهر على الشاشة، عليك زيادة حجم ذاكرة التخزين المؤقت.

يعرض المثال الوارد في هذه الصفحة إعلانًا كل ستة صفوف ويستخدم ذاكرة تخزين مؤقتة تتضمّن ثمانية عناصر. يترك هذا المثال مساحة لعدد قليل من الإعلانات المرئية على الشاشة في الوقت نفسه.

التحقّق ممّا إذا كان الإعلان يظهر على الشاشة

تنفّذ جميع فئات Google Mobile Ads Flutter Plugin التي تعرض طرق عرض النظام الأساسي الفئة AdWithView وتوفّر أداة جلب isMounted. قبل إعادة تعيين إعلان مخزّن مؤقتًا إلى موضع في القائمة، تحقّق من أداة الجلب isMounted للتأكّد من أنّ الإعلان قد تم تمريره خارج الشاشة وأنّه يمكن إعادة استخدامه بأمان.

استرداد إعلان بانر وإعادة استخدامه

عندما تطلب القائمة بانرًا لموضع معيّن، اتّبِع الخطوات التالية:

  1. إعادة استخدام الإعلان الذي تمّ تعيينه لهذا الموضع، إذا كان هناك إعلان
  2. إذا لم تكن ذاكرة التخزين المؤقت ممتلئة، اطلب إعلانًا.
  3. إذا كانت ذاكرة التخزين المؤقت ممتلئة، اختَر إعلانًا مخزَّنًا مؤقتًا وتأكَّد من أنّ قيمة أداة الجلب isMounted هي القيمة false قبل إعادة تعيين الإعلان.
  4. استدعِ طريقة dispose() على كل إعلان في ذاكرة التخزين المؤقت عند إزالة التطبيق المصغّر من شجرة التطبيقات المصغّرة.

يستردّ المثال التالي إعلان بانر ويعيد استخدامه:

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;
  }
}

للاطّلاع على المثال الكامل، يُرجى الرجوع إلى مثال Google Mobile Ads Flutter Plugin.