> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloudx.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 激励视频广告

> 在 Android 应用中集成 CloudX 激励视频广告

<CodeGroup>
  ```kotlin Kotlin theme={null}
  class MainActivity : AppCompatActivity(), CloudXRewardedListener, CloudXAdRevenueListener {
      private lateinit var rewardedAd: CloudXRewardedAd
      private var retryAttempt = 0

      private fun createRewardedAd() {
          rewardedAd = CloudX.createRewarded(this, "your-rewarded-ad-unit-id")
          rewardedAd.listener = this
          rewardedAd.revenueListener = this
          rewardedAd.load()
      }

      private fun showRewardedAd() {
          if (rewardedAd.isAdReady) {
              // 基本展示
              rewardedAd.show(this)

              // 或带有可选的广告位和自定义数据用于跟踪
              // rewardedAd.show(this, "bonus_coins", "level:5,coins:100")
          } else {
              Log.w("CloudX", "激励视频广告尚未准备好")
          }
      }

      override fun onDestroy() {
          super.onDestroy()
          rewardedAd.destroy()
      }

      // CloudXRewardedListener 回调
      override fun onAdLoaded(cloudXAd: CloudXAd) {
          Log.d("CloudX", "激励视频广告已加载，来自 ${cloudXAd.networkName}")
          retryAttempt = 0
      }

      /**
       * Retries loading with exponential backoff: delay doubles with each attempt
       * (2s → 4s → 8s … 32s max) to avoid hammering the server during transient
       * failures. [retryAttempt] resets to 0 in [onAdLoaded].
       */
      override fun onAdLoadFailed(adUnitId: String, cloudXError: CloudXError) {
          Log.e("CloudX", "激励视频广告加载失败: ${cloudXError.message}")
          retryAttempt++
          val delayMillis = TimeUnit.SECONDS.toMillis(2.0.pow(retryAttempt.coerceAtMost(5)).toLong())
          Handler(Looper.getMainLooper()).postDelayed({ rewardedAd.load() }, delayMillis)
      }

      override fun onAdDisplayed(cloudXAd: CloudXAd) {
          Log.d("CloudX", "激励视频广告已展示")
      }

      override fun onAdDisplayFailed(cloudXAd: CloudXAd, cloudXError: CloudXError) {
          Log.e("CloudX", "激励视频广告展示失败: ${cloudXError.message}")
          rewardedAd.load()
      }

      override fun onAdHidden(cloudXAd: CloudXAd) {
          Log.d("CloudX", "激励视频广告已隐藏")
          // 为下次使用重新加载
          rewardedAd.load()
      }

      override fun onAdClicked(cloudXAd: CloudXAd) {
          Log.d("CloudX", "激励视频广告被点击")
      }

      override fun onUserRewarded(cloudXAd: CloudXAd, reward: CloudXReward) {
          Log.d("CloudX", "用户获得奖励: ${reward.amount} ${reward.label}")
          // 为用户发放奖励
      }

      // CloudXAdRevenueListener 回调
      override fun onAdRevenuePaid(cloudXAd: CloudXAd) {
          Log.d("CloudX", "激励视频竞价时收入: ${cloudXAd.revenue}，来自 ${cloudXAd.networkName}")
      }
  }
  ```

  ```java Java theme={null}
  public class MainActivity extends AppCompatActivity implements CloudXRewardedListener, CloudXAdRevenueListener {
      private CloudXRewardedAd rewardedAd;
      private int retryAttempt;

      private void createRewardedAd() {
          rewardedAd = CloudX.createRewarded(this, "your-rewarded-ad-unit-id");
          rewardedAd.setListener(this);
          rewardedAd.setRevenueListener(this);
          rewardedAd.load();
      }

      private void showRewardedAd() {
          if (rewardedAd.isAdReady()) {
              // 基本展示
              rewardedAd.show(this);

              // 或带有可选的广告位和自定义数据用于跟踪
              // rewardedAd.show(this, "bonus_coins", "level:5,coins:100");
          } else {
              Log.w("CloudX", "激励视频广告尚未准备好");
          }
      }

      @Override
      protected void onDestroy() {
          super.onDestroy();
          if (rewardedAd != null) {
              rewardedAd.destroy();
          }
      }

      // CloudXRewardedListener 回调
      @Override
      public void onAdLoaded(@NonNull CloudXAd cloudXAd) {
          Log.d("CloudX", "激励视频广告已加载，来自 " + cloudXAd.getNetworkName());
          retryAttempt = 0;
      }

      @Override
      public void onAdLoadFailed(@NonNull String adUnitId, @NonNull CloudXError cloudXError) {
          Log.e("CloudX", "激励视频广告加载失败: " + cloudXError.getMessage());
          retryAttempt++;
          long delayMillis = TimeUnit.SECONDS.toMillis((long) Math.pow(2, Math.min(5, retryAttempt)));
          new Handler(Looper.getMainLooper()).postDelayed(() -> rewardedAd.load(), delayMillis);
      }

      @Override
      public void onAdDisplayed(@NonNull CloudXAd cloudXAd) {
          Log.d("CloudX", "激励视频广告已展示");
      }

      @Override
      public void onAdDisplayFailed(@NonNull CloudXAd cloudXAd, @NonNull CloudXError cloudXError) {
          Log.e("CloudX", "激励视频广告展示失败: " + cloudXError.getMessage());
          rewardedAd.load();
      }

      @Override
      public void onAdHidden(@NonNull CloudXAd cloudXAd) {
          Log.d("CloudX", "激励视频广告已隐藏");
          // 为下次使用重新加载
          rewardedAd.load();
      }

      @Override
      public void onAdClicked(@NonNull CloudXAd cloudXAd) {
          Log.d("CloudX", "激励视频广告被点击");
      }

      @Override
      public void onUserRewarded(@NonNull CloudXAd cloudXAd, @NonNull CloudXReward reward) {
          Log.d("CloudX", "用户获得奖励: " + reward.getAmount() + " " + reward.getLabel());
          // 为用户发放奖励
      }

      // CloudXAdRevenueListener 回调
      @Override
      public void onAdRevenuePaid(@NonNull CloudXAd cloudXAd) {
          Log.d("CloudX", "激励视频竞价时收入: " + cloudXAd.getRevenue() + "，来自 " + cloudXAd.getNetworkName());
      }
  }
  ```
</CodeGroup>
