AdMob nie wyświetli banera, dopóki nie odświeży lub nie zaloguje się w Google Plus

Mam problem. Mój AdMob został skonfigurowany od jakiegoś czasu bez problemu, ale zauważyłem coś nie tak. Reklama została pomyślnie załadowana (widzę wiadomość z ddms), ale się nie wyświetla. Zostanie wyświetlony po okresowym 60 sekundowym odświeżeniu lub po otwarciu loginu do google plus. Problem występuje tylko w przypadku usług Google Play AdMob, a nie w przypadku słoika AdMobSDK. Przejdę na słoik AdMob, jednak korzystam z usług gier Google Play do tabel wyników i osiągnięć.

Podejrzewam, że problemem jest brak widoku lub nieprawidłowe ustawienia.

Więc znowu reklama wyświetli się po 60 sekundach (wraz z odświeżeniem reklamy) oczekiwania lub po uruchomieniu ekranu logowania do usług Google Play.

Dodam mój kod, powinienem również wspomnieć, że przeszedłem na nową stronę AdMob i powtarzam, że problem nie występuje, jeśli użyję pliku jar AdMob (reklama jest następnie wyświetlana w ciągu 2-3 sekund jak zwykle). Wytnąłem kod usług gier Google Play (nie mają one wpływu na ten problem, ponieważ próbowałem w innej aplikacji bez nich, a problem nadal występuje).

Kod MainActivity:

public class MainActivity extends AndroidApplication {

public static enum AdsStatus {
    SHOW_ADS, HIDE_ADS;
}

protected RelativeLayout layout;

protected static AdView adMobView;

public static class InnerHandler extends Handler {
    WeakReference<MainActivity> mActivity;

    InnerHandler(MainActivityactivity) {
        mActivity = new WeakReference<MainActivity>(activity);
    }

    @Override
    public void handleMessage(final Message msg) {
        if(msg.obj instanceof AdsStatus) {
            switch((AdsStatus)msg.obj) {
                case SHOW_ADS:
                    mActivity.get().showAds();
                    break;
                case HIDE_ADS:
                    mActivity.get().hideAds();
                    break;
            }
        }
    }
}
protected Handler handler = new InnerHandler(this);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create the layout
    layout = new RelativeLayout(this);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    // Create the libgdx View
    View gameView = initializeForView(new MainApplicationListener(), true);
    layout.addView(gameView);

    //Ad Mob
    final DisplayMetrics displayMetrics = MainActivity.this
            .getApplicationContext().getResources()
            .getDisplayMetrics();

    if (displayMetrics.widthPixels >= 800 && displayMetrics.heightPixels >= 480) {
        if(adMobView != null) {
            adMobView.destroy();
        }

        adMobView = new AdView(AirDance.this);
        adMobView.setAdUnitId(<MY_ID_IS_HERE>);
        adMobView.setAdSize(AdSize.SMART_BANNER);

        RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

        AdRequest adRequest = new AdRequest.Builder()
                            .addTestDevice(<MY_DEVICE_IS_HERE>)
                            .build();
        adMobView.loadAd(adRequest);

        layout.addView(adMobView, adParams);
    }

    // Hook it all up
    setContentView(layout);
}

@Override
protected void onResume() {
    super.onResume();

    AppRater.applicationLaunched(this, analytics);

    if(adMobView != null) {
        adMobView.resume();
    }
}

@Override
protected void onPause() {
    super.onPause();

    if(adMobView != null) {
        adMobView.pause();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if(adMobView != null) {
        adMobView.destroy();
        adMobView = null;
    }
}

public void showAds() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if(adMobView != null) {
                adMobView.setEnabled(true);
                adMobView.setVisibility(View.VISIBLE);
            }
        }
    });
}

public void hideAds() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if(adMobView != null) {
                adMobView.setEnabled(false);
                adMobView.setVisibility(View.GONE);
            }
        }
    });
}
}

A oto AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="..."
    android:installLocation="auto"
    android:versionCode="16"
    android:versionName="1.2.6" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-feature android:name="android.hardware.screen.landscape"/>
    <uses-feature android:name="android.hardware.touchscreen.multitouch" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="MainActivity">

        <meta-data android:name="com.google.android.gms.games.APP_ID"
            android:value="@string/app_id" />

        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name="...MainActivity"
            android:label="MainActivity"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- adMob -->
        <activity android:name="com.google.android.gms.ads.AdActivity"
             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    </application>
</manifest>

EDYTOWAĆ : dobrze, więc reklama staje się widoczna po zablokowaniu i odblokowaniu ekranu przy otwartej aplikacji, możesz także kliknąć niewidoczną reklamę

EDYTOWAĆ : OK, chyba to rozwiązałem. Właśnie ręcznie przeładowałem cały układ na zdarzenieAdLoad. W każdym razie jest to tylko funkcjonalne rozwiązanie, nie wyjaśnia, dlaczego tak się dzieje z usługami Google Play AdMob.

adMobView.setAdListener(new AdListener() {

    @Override
    public void onAdLoaded() {
        super.onAdLoaded();

        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                layout.requestLayout();
            }
        });
    }

});

questionAnswers(5)

yourAnswerToTheQuestion