Ошибка: вызов WebView.destroy(), все еще прикрепленный

Я получаю эту ошибку, когда устройство меняет ориентацию:

Error: WebView.destroy() called while still attached

С помощью этого кода:

protected void onDestroy()
{
    if (adView != null)
    {
        adView.destroy();
    }
}

В чем причина этого? Как избежать этой ошибки?

Ответ 1

Сначала вам нужно отключить веб-просмотр:

webViewPlaceholder.removeView(myWebView);
myWebView.removeAllViews();
myWebView.destroy();

Это сделало это для меня.

Ответ 2

Чтобы избежать ошибки, вам просто нужно удалить все виды, прежде чем уничтожить объявление.

@Override
public void onDestroy()
{
    if (adView != null)
    {
        adView.removeAllViews();
        adView.destroy();
    }
    super.onDestroy();
}

Ответ 3

 @Override
public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if (mWebView != null) {
        mWebView.destroy();
    }
}

Ответ 4

Согласно моим тестам, эта проблема раскрывается в AdMob SDK v6.4.1 и, по крайней мере, на Android v4.2.2+. При тестировании примера приложения AdMob, указанного в https://developers.google.com/mobile-ads-sdk/docs/admob/fundamentals#android (прямая ссылка http://google-mobile-dev.googlecode.com/files/Android_XML.zip), проблема возникает при закрытии экрана образца.

Моя работа вокруг:

 @Override
  public void onDestroy()
  {
    // Destroy the AdView.
    if (adView != null)
    {
      final ViewGroup viewGroup = (ViewGroup) adView.getParent();
      if (viewGroup != null)
      {
        viewGroup.removeView(adView);
      }
      adView.destroy();
    }

    super.onDestroy();
  }

Надеюсь, что это поможет другим людям, и что AdMob очень скоро исправит эту неприятную проблему.

Ответ 5

Если вы не получите эту ошибку, вам нужно иметь родительский макет, например.: RelativeLayout и удалить компонент WebView, который мог быть определен на вашем макетеWebView.xml.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webviewRelativeLayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

<WebView
    android:id="@+id/webView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/headerAlarmsWebViewTxt"
    android:layout_marginBottom="0dip"
    android:hapticFeedbackEnabled="true"
    android:overScrollMode="never"
    android:scrollbarAlwaysDrawVerticalTrack="false"
    android:scrollbars="none" />

 </RelativeLayout>

Затем вы назначаете его переменной экземпляра, например.

_layout = (RelativeLayout) findViewById(R.id.webviewRelativeLayout);
webView = (WebView) findViewById(R.id.webView1);

и в Destroy сделайте что-то вроде этого:

@Override
protected void onDestroy() {
    super.onDestroy();
    _layout.removeView(webView);
    webView.setFocusable(true);
    webView.removeAllViews();
    webView.clearHistory();
    webView.destroy();
}