You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AdColony激励视频空指针异常求助:跳转页面调用show时报错

解决AdColony激励视频展示时的空指针异常问题

你遇到的崩溃核心原因很明确:当你在ResultActivity里调用showRewardedVideo()时,rvAd对象还没有被初始化。AdColony的广告请求是异步操作,你在MainActivity的onCreate里触发了加载,但广告需要时间去请求、下载和准备,很可能在你打开ResultActivity的时候,rvListener的onRequestFilled回调还没被触发,rvAd还是null,这时候调用show()自然会抛出空指针异常。

下面是具体的解决方案和代码优化建议:

1. 添加广告就绪状态标记

首先在MainActivity里添加一个静态布尔变量,用来跟踪广告是否已经准备好可以展示:

public class MainActivity extends AppCompatActivity {
    // ... 原有变量 ...
    private static boolean isRewardedVideoReady = false; // 新增状态标记
    
    // ... 原有代码 ...
}

2. 更新回调中的状态

在广告加载完成、过期或请求失败时,更新这个状态标记:

rvListener = new AdColonyInterstitialListener() {
    @Override
    public void onRequestFilled( AdColonyInterstitial ad ) {
        rvAd = ad;
        isRewardedVideoReady = true; // 广告准备就绪,标记为true
    }

    @Override
    public void onRequestNotFilled( AdColonyZone zone ) {
        isRewardedVideoReady = false; // 请求失败,标记为未就绪
    }

    @Override
    public void onExpiring( AdColonyInterstitial ad ) {
        isRewardedVideoReady = false; // 广告即将过期,标记为未就绪
        AdColony.requestInterstitial( RV_ZONE_ID, rvListener, ad_options);
    }
};

3. 安全地展示广告

修改showRewardedVideo()方法,先检查广告是否就绪,再执行展示操作,同时处理未就绪的情况:

public static void showRewardedVideo(){
    if (isRewardedVideoReady && rvAd != null) {
        rvAd.show();
        isRewardedVideoReady = false; // 展示后标记为未就绪,避免重复展示
        loadRewardedVideo(); // 提前请求下一条广告,保证后续有广告可用
    } else {
        // 广告未准备好,这里可以根据需求处理:比如提示用户,或者触发重新请求
        loadRewardedVideo();
    }
}

4. 优化ResultActivity中的调用(可选)

如果需要给用户更友好的提示,可以在ResultActivity里先检查广告状态再调用展示:

public class ResultActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        
        if (MainActivity.isRewardedVideoAvailable()) {
            MainActivity.showRewardedVideo();
        } else {
            Toast.makeText(this, "广告正在加载,请稍等片刻", Toast.LENGTH_SHORT).show();
            MainActivity.loadRewardedVideo();
        }
    }
}

对应的,在MainActivity里新增一个暴露状态的方法:

public static boolean isRewardedVideoAvailable() {
    return isRewardedVideoReady && rvAd != null;
}

额外建议

  • 尽量避免把广告逻辑放在Activity的静态方法里,推荐封装成一个单例的广告管理类,这样更解耦,也能更好地管理广告生命周期,避免内存泄漏风险。
  • 注意处理广告展示后的回调(比如奖励发放),确保用户完成观看后能正确获得奖励。

内容的提问来源于stack exchange,提问作者Sarlken Konig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:32:17