Androidアプリケーションにリワードビデオを実装したいのですが、最初にクリックしてビデオを表示するのは問題ありませんが、その後2回目または3回目にクリックしてもう一度表示します。それは機能せず、ログにスローされます:
W/MessageQueue: Handler (com.google.Android.gms.ads.exoplayer2.upstream.u) {1e5487c} sending message to a Handler on a dead thread
Java.lang.IllegalStateException: Handler (com.google.Android.gms.ads.exoplayer2.upstream.u) {1e5487c} sending message to a Handler on a dead thread
at Android.os.MessageQueue.enqueueMessage(MessageQueue.Java:543)
at Android.os.Handler.enqueueMessage(Handler.Java:631)
at Android.os.Handler.sendMessageAtTime(Handler.Java:600)
at Android.os.Handler.sendMessageDelayed(Handler.Java:570)
at Android.os.Handler.sendEmptyMessageDelayed(Handler.Java:534)
at Android.os.Handler.sendEmptyMessage(Handler.Java:519)
at com.google.Android.gms.ads.exoplayer2.upstream.u.run(:com.google.Android.gms.DynamiteModulesA:212)
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:423)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1113)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:588)
at Java.lang.Thread.run(Thread.Java:818)
Could not show rewarded video ad from adapter.
Java.lang.NullPointerException: Attempt to read from field 'com.google.Android.gms.ads.internal.client.bq ip.a' on a null object reference
at com.google.ads.mediation.a.g(:com.google.Android.gms.DynamiteModulesA:17227)
at com.google.Android.gms.ads.internal.mediation.client.u.f(:com.google.Android.gms.DynamiteModulesA:436)
at com.google.Android.gms.ads.internal.reward.b.a(:com.google.Android.gms.DynamiteModulesA:1314)
at com.google.Android.gms.ads.internal.reward.client.e.onTransact(:com.google.Android.gms.DynamiteModulesA:65)
at Android.os.Binder.transact(Binder.Java:387)
at com.google.Android.gms.internal.zznu$zza$zza.show(Unknown Source)
at com.google.Android.gms.internal.zzoc.show(Unknown Source)
at com.reperfection.monopoly.MainActivity$1.onClick(MainActivity.Java:70)
at Android.view.View.performClick(View.Java:5702)
at Android.view.View$PerformClick.run(View.Java:22546)
at Android.os.Handler.handleCallback(Handler.Java:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:158)
at Android.app.ActivityThread.main(ActivityThread.Java:7237)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1230)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)
Could not call showVideo.
Android.os.RemoteException
at com.google.Android.gms.ads.internal.mediation.client.u.f(:com.google.Android.gms.DynamiteModulesA:439)
at com.google.Android.gms.ads.internal.reward.b.a(:com.google.Android.gms.DynamiteModulesA:1314)
at com.google.Android.gms.ads.internal.reward.client.e.onTransact(:com.google.Android.gms.DynamiteModulesA:65)
at Android.os.Binder.transact(Binder.Java:387)
at com.google.Android.gms.internal.zznu$zza$zza.show(Unknown Source)
at com.google.Android.gms.internal.zzoc.show(Unknown Source)
at com.reperfection.monopoly.MainActivity$1.onClick(MainActivity.Java:70)
at Android.view.View.performClick(View.Java:5702)
at Android.view.View$PerformClick.run(View.Java:22546)
at Android.os.Handler.handleCallback(Handler.Java:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:158)
at Android.app.ActivityThread.main(ActivityThread.Java:7237)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1230)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)
これは私のコードです:
public class MainActivity extends AppCompatActivity implements RewardedVideoAdListener {
TextView counterTV;
ImageView clickerBoard;
int counter;
int step = 1;
RelativeLayout parentRl;
LinearLayout ln1;
LinearLayout ln2;
private RewardedVideoAd mAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
setContentView(R.layout.activity_main);
counterTV = (TextView) findViewById(R.id.counter);
parentRl = (RelativeLayout) findViewById(R.id.parentRl);
clickerBoard = (ImageView) findViewById(R.id.clickerBoard);
ln1 = (LinearLayout) findViewById(R.id.ln1);
ln2 = (LinearLayout) findViewById(R.id.ln2);
// Init rewarded video
mAd = MobileAds.getRewardedVideoAdInstance(this);
mAd.setRewardedVideoAdListener(this);
loadRewardedVideoAd();
ln1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mAd.isLoaded()) {
mAd.show();
}
}
});
}
private void loadRewardedVideoAd() {
mAd.loadAd("ca-app-pub-3940256099942544/5224354917", new AdRequest.Builder().build());
}
@Override
public void onRewarded(RewardItem reward) {
Toast.makeText(this, "onRewarded! currency: " + reward.getType() + " amount: " +
reward.getAmount(), Toast.LENGTH_SHORT).show();
// Reward the user.
}
// The following listener methods are optional.
@Override
public void onRewardedVideoAdLeftApplication() {
Toast.makeText(this, "onRewardedVideoAdLeftApplication",
Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdClosed() {
Toast.makeText(this, "onRewardedVideoAdClosed", Toast.LENGTH_SHORT).show();
loadRewardedVideoAd();
}
@Override
public void onRewardedVideoAdFailedToLoad(int errorCode) {
Toast.makeText(this, "onRewardedVideoAdFailedToLoad", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdLoaded() {
Toast.makeText(this, "onRewardedVideoAdLoaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdOpened() {
Toast.makeText(this, "onRewardedVideoAdOpened", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoStarted() {
Toast.makeText(this, "onRewardedVideoStarted", Toast.LENGTH_SHORT).show();
}
@Override
public void onResume() {
mAd.resume(this);
super.onResume();
}
@Override
public void onPause() {
mAd.pause(this);
super.onPause();
}
@Override
public void onDestroy() {
mAd.destroy(this);
super.onDestroy();
}}
何が悪いのかを理解するのを手伝ってもらえますか?ありがとう
アクティビティに入るときに実行されるAdMobビデオを配置していますが、2回目にアクティビティに入るときに同じ問題が発生しました。私の場合、実行可能ループを設定して、ビデオが既にロードされているときにビデオを開始します。
if (mRewardedVideoAd.isLoaded()) {
mRewardedVideoAd.show();
}else{
loadRewardedVideoAd();
}
これは私のすべてのコードの一部です
private boolean started = false;
private Handler handler = new Handler();
private void initializeAdMob() {
mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
mRewardedVideoAd.setRewardedVideoAdListener(this);
loadRewardedVideoAd();
}
private void loadRewardedVideoAd() {
if (!mRewardedVideoAd.isLoaded()) {
mRewardedVideoAd.loadAd(getString(R.string.id_block_activity), new AdRequest.Builder().build());
}
}
private void showRewardedVideoAd() {
if (BaseInteractor.isNetworkAvailable(this)) {
showProgressBar(true);
start();
}
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
if (mRewardedVideoAd.isLoaded()) {
mRewardedVideoAd.show();
}else{
loadRewardedVideoAd();
}
if (started) {
start();
}
}
};
public void stop() {
started = false;
handler.removeCallbacks(runnable);
}
public void start() {
started = true;
handler.postDelayed(runnable, 2000);
}
最後に私はランナブルを停止します
@Override
public void onRewardedVideoAdOpened() {
showProgressBar(false);
stop();
}
これがお役に立てば幸いです。
手動 については、ビデオをリロードする必要があるようです:このメソッドをオーバーライドします
onRewardedVideoAdClosed() {
loadRewardedVideoAd();
}
AdMobから広告を取得するようにリクエストした場合、AdMobから広告を取得するための別のAdMob動画リクエストを既に受け取っていて、最初に行ったリクエストが広告で応答し、show()広告を表示することにした場合、次のようになります。 アダプターからのリワードビデオ広告を表示できませんでした。エラー。
どういうわけかシングルトンだと思いました。あなたが行った2番目のリクエストは、最初のリクエストで何かを壊します。 com.google.Android.gms.ads.reward.RewardedVideoAdListener()
の複数のインスタンスを作成できるため、これは人々を混乱させます。私の場合、最初のリクエストからの応答をすでに待っている場合は、admobへの2番目のリクエストをブロックする必要があります。
私はまったく同じ問題に直面していて、数日間の調査の後、解決策を見つけました。
RewardedVideoAd
のライフサイクルには本当に注意する必要があります。私の場合、アクティビティのライフサイクルをこのオブジェクトに関連付けました。しかし、onResume()
をRewardedVideoAd
オブジェクトに呼び出すと、一種の「再初期化」が行われることを理解しました。そのため、以前に広告を読み込んだ場合でも、広告を再読み込みする必要があります。
また、他のスレッドで見つけたかもしれないように、SDKで許可されていても、広告を同時にロードしようとしないでください。フローで広告をロードすることを確認してくださいのみ広告がプリロードされていない場合、またはonResume()
をRewardedVideoAd
オブジェクトに呼び出した場合。
RewardedVideoAd
コールバックメソッドをログに記録して、広告の読み込みフローを理解して最適化するのに役立ててください。