如何避免Admob阻止UI线程

时间:2012-02-27 21:36:56

标签: java android 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对象会阻止UI线程1到2秒。

有没有办法避免这种情况?

由于

5 个答案:

答案 0 :(得分:4)

我有类似的问题。通过将广告请求延迟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);

答案 1 :(得分:1)

使用线程:

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");
}

答案 2 :(得分:1)

这是我的解决方案:

  public class YHYBackgroundThread extends AsyncTask<Object, Object, Object> {
        private YHYBackgroundListener mListener;
        private Context context;
    
        public YHYBackgroundThread(Context context) {
    
            this.context= context;
    
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
    
    
    
        }
    
        @Override
        protected Object doInBackground(Object... params) {
    
            if(mListener != null){
                return  mListener.onBackground(params);
            }
    
            return null;
        }
    
        @Override
        protected void onPostExecute(Object t) {
            if (mListener != null) {
    
    
                mListener.onPostExecute(t);
                
            }
        }
    
        public YHYBackgroundThread setListener(YHYBackgroundListener mListener){
    
            this.mListener = mListener;
    
            return this;
        }
    
    }

YHYBackgroundListener

public interface YHYBackgroundListener {

    Object onBackground(Object... params);
    void onPostExecute(Object list);
}

当您需要展示广告时调用此方法

   new YHYBackgroundThread(context).setListener(


                    new YHYBackgroundListener() {
                        @Override
                        public Object onBackground(Object... params) {

                            AdRequest request = new AdRequest.Builder().build();


                            return request;
                        }

                        @Override
                        public void onPostExecute(Object list) {

                            AdRequest request = (AdRequest) list;
                            adView.loadAd(request);
                        }
                    }
            ).execute();

答案 3 :(得分:0)

您正在UI线程中创建AdView,这是被阻止的原因。 当AdView启动时,线程不会做任何其他事情。

您可以尝试在其他线程中加载AdView,也可以使用AsyncTask以UI安全方式加载它。

检查此项以获取有关Android中的AsyncTask和Threading的更多信息。

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

答案 4 :(得分:0)

就我而言,我在一项请求中请求了太多广告项目。堆超载,GC开始执行操作,并阻塞了我的主线程。建议尽量避免在一个请求中请求过多的广告。

123._SYS_BIC.meag.app.qthor.cidwh_eingangsschicht.backend.dblayer.l2.checks/MasterData_Holdings.
153._SYS_BIC.meag.app.qthor.centralAdministration.backend.dblayer.l2.checks/AuditAndSecurities.
meag.app.qthor.centralAdministration.backend.dblayer.l2.checks/GeneralLedger