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

