Как избежать 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");
}