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

解决Android中JavascriptInterface调用主线程显示RewardedAd的线程问题

问题解决:rewardedAd.show() 需在主线程调用的修复方案

问题根源

WebView的JavascriptInterface暴露给JS的方法默认运行在WebView的后台线程,而非Android应用的主线程。而AdMob的rewardedAd.show()方法要求必须在主线程执行,直接调用就会触发线程错误。

修复方案(两种任选其一)

方案一:在ShowAd方法内部切换到主线程执行广告展示

修改MainActivity中的ShowAd方法,将广告展示的核心逻辑包裹在runOnUiThread中:

public void ShowAd(){
    long milliNow = System.currentTimeMillis();
    boolean showAd = (milliBetweenRewardedAd > 0 &&
            milliNow >= (milliBetweenRewardedAd + milliLastRewardedAd));

    if (showAd && rewardedAd != null) {
        // 切换到主线程执行广告展示操作
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Activity activityContext = MainActivity.this;
                rewardedAd.show(activityContext, new OnUserEarnedRewardListener() {
                    @Override
                    public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
                        int rewardAmount = rewardItem.getAmount();
                        String rewardType = rewardItem.getType();
                        milliLastRewardedAd = System.currentTimeMillis();
                    }
                });
            }
        });
    }
}

方案二:在JavascriptInterface中切换到主线程再调用ShowAd

修改WebAppInterface的triggerAdvert方法,通过Activity的runOnUiThread切换线程后再调用ShowAd:

@android.webkit.JavascriptInterface
public void triggerAdvert() {
    if(m_Context != null) {
        m_Context.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                m_Context.ShowAd();
            }
        });
    }
}

方案说明

两种方案都能解决线程问题,推荐使用方案一,因为它把线程切换的逻辑封装在ShowAd方法内部,外部调用时无需关心线程状态,代码的封装性和可维护性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:16:32