2012-02-07 3 views
6

Так я последовал пост на избежать утечек WebView памяти, который предполагает использовать Webview контейнер, а затем программно добавить/удалить WebView из контейнера в кодах активности: Memory leak in WebViewAndroid BadTokenException при использовании WebView контейнера

Однако , я попал в следующий вылет при нажатии на HTML элементе, который побуждает список опций для выбора (например, дата/месяц выпадающего списка)

W/dalvikvm(17767): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
W/WindowManager(129): Attempted to add window with non-application token WindowToken{4094b730 token=null}. Aborting. 
FATAL EXCEPTION: main 
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
android.view.ViewRoot.setView(ViewRoot.java:561) 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
android.app.Dialog.show(Dialog.java:265) 
android.webkit.WebView$InvokeListBox.run(WebView.java:9170) 
android.os.Handler.handleCallback(Handler.java:587) 
android.os.Handler.dispatchMessage(Handler.java:92) 
android.os.Looper.loop(Looper.java:150) 
android.app.ActivityThread.main(ActivityThread.java:4263) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:507) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
dalvik.system.NativeStart.main(Native Method) 

у меня есть следующий в моем макете:

FrameLayout 
    android:id="@+id/webview_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_below="@+id/titlebar"> 
/FrameLayout> 

У меня есть следующие в OnCreate():

mWebViewContainer = (FrameLayout)findViewById(R.id.webview_container); 
mWebView   = new WebView(getApplicationContext()); 
mWebViewContainer.addView(mWebView); 

mWebView.setWebChromeClient(new WebChromeClient()); 

Я также установил WebViewClient.

Я проверил, что mWebView.getWindowToken() возвращает ненулевое значение.

Любые идеи относительно того, почему этот вопрос может произойти?

Редактировать: Я еще несколько экспериментировал и оглядывался, но до сих пор не решил эту проблему. Все работает нормально, если я помещаю webview непосредственно в сам макет. Но я не хочу этого делать, потому что хочу иметь возможность динамически менять веб-просмотры.

+1

ли еще произойти ошибка, если заменить «getApplicationContext()» с «это» при создании WebView? –

ответ

9

При создании WebView вы в настоящее время используете контекст приложения. Вы должны использовать контекст Activity. Чтобы решить проблему, при создании WebView замените getApplicationContext() на this.

+0

Не должен ли это быть комментарий? Я думаю, у вас есть репутация, чтобы добавить комментарий. Переходите к комментарию, прежде чем кто-то проголосует – kosa

+0

Правда, правда. Отредактировав ответ, я думаю, что это может решить проблему. –

+0

К сожалению, это не решает проблему. Подобный сбой происходит даже при использовании «this» –

13

Проблема здесь:

mWebView.setWebChromeClient(new WebChromeClient()); 

после того, как вы покинули свою деятельность, есть вероятность того, что вы некоторые обратные вызовы в WebChromeClient будут пытаться открывать окна, пока контейнер активность была уничтожена.
Вот одно решение, которое работает для меня, просто добавьте mWebView.destroy() в OnDestroy вашей деятельности в()

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mWebView != null) 
      mWebView.destroy(); 
    } 
Смежные вопросы