Как избежать Admob, блокирующего поток пользовательского интерфейса

Я обнаружил, что некоторые из моих действий заблокированы при запуске. Поэтому я написал этот код в новом проекте:

public class LayoutTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        long now = System.currentTimeMillis();

        new AdView(this, AdSize.BANNER, "MY_ID");

        Log.e("Admob Test","The UI was blocked "+(System.currentTimeMillis()-now)+"ms");
    }
}

И результатом является то, что первое создание объекта AdView блокирует поток пользовательского интерфейса между 1 и 2 секундами.

Есть ли способ избежать этого?

Спасибо

Ответ 1

Вы создаете свой AdView в потоке пользовательского интерфейса, который является причиной блокировки. Хотя инициация AdView имеет место, нить не сделает ничего другого.

Вы можете попробовать загрузить AdView в другом потоке или можете использовать AsyncTask для его загрузки безопасным способом.

Проверьте это для получения дополнительной информации об AsyncTask и Threading в Android.

http://developer.android.com/reference/android/os/AsyncTask.html

Ответ 2

У меня была аналогичная проблема. Разрешил его, задерживая объявление-запрос на 1 секунду (что дает время для AdView для загрузки, а не для блокировки пользовательского интерфейса.

        new Timer().schedule(new TimerTask()
        {
            @Override
            public void run()
            {
                MainActivity.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        AdRequest adRequest = new AdRequest.Builder()
                                .addTestDevice(AD_TEST_DEVICE)
                                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                                .build();

                        adView.loadAd(adRequest);
                    }
                });
            }
        }, 1000);

Ответ 3

Использовать потоки:

public class LayoutTestActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    long now = System.currentTimeMillis();

    new Thread(new Runnable() {

        public void run() {
            new AdView(this, AdSize.BANNER, "MY_ID");               
        }
    }).start();

    Log.e("Admob Test","The UI was blocked "+(System.currentTimeMillis()-now)+"ms");
}