2014-12-04 76 views
1

我是新手到Android,它的我AndroidLauncherjava文件intersial代码上ADMOB-java.lang.IllegalStateException:isLoaded必须调用主UI线程

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


     RelativeLayout layout = new RelativeLayout(this); 
     AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 


     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 MyGdxGame(this),config); 


     AdView adView = new AdView(this); 
     adView.setAdUnitId("ca-app-pub-6916351754834612/9855033027"); 
     adView.setAdSize(AdSize.BANNER); 
     adView.loadAd(new AdRequest.Builder() 
     .build()); 

     layout.addView(gameView); 

     // Add the AdMob view 
     RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
     adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); 
     adParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE); 
     adView.setLayoutParams(adParams); 
     adView.setBackgroundColor(Color.BLACK); 

     layout.addView(adView, adParams); 


     iAd = new InterstitialAd(this); 
     iAd.setAdUnitId(AD_UNIT_ID); 
     loadInterstitial(); 
     iAd.setAdListener(new AdListener() { 
      @Override 
      public void onAdLoaded() { 
       } 

      @Override 
      public void onAdFailedToLoad(int errorCode) { 

      } 
     }); 
     setContentView(layout); 
     } 

    public void loadInterstitial() { 
     /*AdRequest adRequest = new AdRequest.Builder() 
     .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) 
     .addTestDevice("0FD328B10106BD9B2BE832163D43D085") 
     .build();*/ 
     AdRequest adRequest = new AdRequest.Builder().build(); 
     iAd.loadAd(adRequest); 

     //iAd.loadAd(adRequest); 
    } 

    public void showInterstitial() { 
     if (iAd.isLoaded()) { 
      iAd.show(); 
     } else { 
      //Log.d(TAG, "Interstitial ad is not loaded yet"); 
     } 
    } 

它我的插页式广告代码;我得到java.lang.IllegalStateException: isLoaded must be called on the main UI thread这里.Checked几个解决方案,可以不固定。我才知道的iAd是不是loading.Can任何人帮助我,我哪里错了。谢谢你在前进

+0

我张贴我的解决方案在http://stackoverflow.com/questions/28501787/admob-interstitial-and-error-isloaded-must-be-called-on-the-main-ui-thread/34845549#34845549 – 2016-01-18 00:47:43

回答

4

您没有显示showInterstitial()被调用的地方,其中包含对isLoaded的调用!
请检查堆栈跟踪以获取更多线索。

盲目我要说的是,你从一个事件侦听器或其他(GDX?)后台线程调用showInterstitial。如果是这样的话,你有两个选择:

showInterstitial()防呆

public void showInterstitial() { 
    if(Looper.myLooper() != Looper.getMainLooper()) { 
     runOnUiThread(new Runnable() { 
      @Override public void run() { 
       doShowInterstitial(); 
      } 
     }); 
    } else { 
     doShowInterstitial(); 
    } 
} 
private void doShowInterstitial() { 
    if (iAd.isLoaded()) { 
     iAd.show(); 
    } else { 
     //Log.d(TAG, "Interstitial ad is not loaded yet"); 
    } 
} 

制作调用代码聪明

void myMethodCallingShowInterstitial() { 
    ... doing my other background stuff ... 
    // replace showInterstitial(); with below: 
    activityReference.runOnUiThread(new Runnable() { 
     @Override public void run() { 
      activityReference.showInterstitial(); 
     } 
    }); 
    ... doing my other background stuff ... 
} 

在上述两种情况下,任何你runOnUiThread后做不能依靠的间质性正在显示!如果你不小心同时实现,因为万无一失的方法,不会再张贴到UI这不是一个问题。

作为runOnUiThread的替代方案,您可以使用Handler,更多信息请参阅the official documentation on this

+0

谢谢:)优秀解释 – 2014-12-05 15:53:57

3

你好,你可以用runOnUiThread

public void showInterstitial() { 
runOnUiThread(new Runnable() { 
    public void run() { 
     if (iAd.isLoaded()) { 
      iAd.show(); 
     } else { 
      //Log.d(TAG, "Interstitial ad is not loaded yet"); 
     } 
    } 
}); 

}

希望这有助于尝试。

相关问题