[编辑:我刚刚将adView.setVisibility(View.GONE)
替换为adView.setVisibility(View.INVISIBLE)
,但WebView加载并没有崩溃,因此,当我删除AdView时,看起来确实与它有关xml元素,而不仅仅是使其不可见。使其不可见并不理想,因为您应该在广告的底部看到一个白色的空白栏。因此,看起来确实与重新加载Webview或弄乱UI有关。我的html / javascript代码很可靠,可以处理任何尺寸更改。]
我在广告横幅的上方有一个Webview("ca-app-pub-3940256099942544/6300978111"
是测试广告ID,因此我没有得到任何个人信息)
<WebView
android:id="@+id/webView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="5dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/adView" />
<!-- "BANNER" or "LARGE_BANNER" -->
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:adSize="BANNER"
app:adUnitId="ca-app-pub-3940256099942544/6300978111"/>
注意:Web视图中的app:layout_constrain...
。我认为这可能是问题的一部分。
在启动时,我正在检查购买情况。如果用户进行了任何购买,我将关闭代码为
的广告public void turnAdvertsOff() {
advertsOn = false;
AdView adView = (AdView) m_Context.findViewById(R.id.adView);
adView.destroy();
adView.setVisibility(View.GONE);
}
在行adView.setVisibility(View.GONE);
下,程序因毫无根据的指控而崩溃:
I/chromium: [INFO:CONSOLE(6381)] "Uncaught Error: Java exception was raised during method invocation", source: file:///android_asset/www/index.html?IsAndroidWebview=true (6381)
D/WebView: loadUrl=about:blank
D/WebView: destroy
但是,我知道Webview中没有任何问题,因为当我将//adView.setVisibility(View.GONE);
行散列时,WebView可以很好地加载。
有人知道为什么吗?
与app:layout_constraint..
有什么关系,如果可以,我该如何克服?
答案 0 :(得分:0)
建议隐藏adView:
adView.pause();
adView.setVisibility(View.GONE);
答案 1 :(得分:0)
尝试使用如下所示的LinearLayout
>string<
SMART_BANNER
答案 2 :(得分:0)
好的,我找到了答案,而且不明显。这是@mTak的答案与Android应用程序工作方式的关键组成部分(这是我没有意识到的,因为我来自html / javascript世界,而多线程是程序员在该环境中绝对控制的东西) )。
正在另一线程上进行购买检查。因此尝试进行adView.setVisibility(View.GONE)
会使程序感到悲伤。除了主UI线程外,它似乎不喜欢您弄乱UI。
这就是我更改代码以使Android协议满意的方式:
我的购买支票(在单独的线程中,但在MainActivity中)。请注意,stringListARR
只是一个字符串数组,其中包含用户购买的产品代码。因此,无论是否购买了至少一件商品,我都决定关闭广告:
// Any purchase means we have no adverts
myAdverts.advertsOn = stringListARR.size() > 0 ? false : true;
// This is the evil line of code that caused the problem - this was being called not on the UI thread
//if(!myAdverts.advertsOn) myAdverts.turnAdvertsOff();
// And this is how to do it properly forcing it to be run on the UI thread
// 'this' in the following is my MainActivity
if(!myAdverts.advertsOn){
this.runOnUiThread(new Runnable(){
@Override
public void run() {
myAdverts.turnAdvertsOff();
}
});
}
@mTak正确正确地做事是完全正确的。我的turnAdvertsOff()
看起来像这样:
public void turnAdvertsOff() {
advertsOn = false;
AdView adView = (AdView) m_Context.findViewById(R.id.adView);
adView.pause();
adView.setEnabled(false);
adView.setVisibility(View.GONE);
}
因此,感谢@mTak以及Google上这个几乎找不到的线程,这给了我一个主意:
https://groups.google.com/forum/#!topic/google-admob-ads-sdk/d30EAC1zGFo
实际上,如果人们在Android上弄乱UI时,Stackoverflow上的任何人都在回答有关崩溃的问题,那么这个runOnUiThread
可能是第一个想到的解决方案。这并不明显,很难发现。