setVisibility(View.GONE)导致崩溃

时间:2018-08-11 18:13:04

标签: android xml

[编辑:我刚刚将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..有什么关系,如果可以,我该如何克服?

3 个答案:

答案 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可能是第一个想到的解决方案。这并不明显,很难发现。