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
相关产品推荐
相关产品推荐

