2012-02-07 19 views
6

का उपयोग कर तो मैं WebView मेमोरी लीक से बचने पर एक पोस्ट है, जो वेब दृश्य कंटेनर का उपयोग कर पता चलता है और उसके बाद प्रोग्राम के रूप में गतिविधि कोड में कंटेनर से वेबव्यू हटाने जोड़ने/पीछा किया: Memory leak in WebViewएंड्रॉयड 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) 

मेरे पास है मेरे लेआउट में निम्नलिखित निम्न क्रैश मारा

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

mWebView.setWebChromeClient(new WebChromeClient()); 

मैं भी एक WebViewClient सेट:

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

मैं OnCreate() में निम्नलिखित है।

मैं सत्यापित किया है कि mWebView.getWindowToken() एक गैर-शून्य मान है।

क्यों इस मुद्दे को हो रहा हो सकता है के रूप में कोई भी विचार?

संपादित करें: मैं कुछ और अधिक प्रयोग और चारों ओर देख किया है, लेकिन अभी भी इस समस्या हल नहीं किया है। यदि मैं सीधे वेब लेआउट को लेआउट में डालता हूं तो सब ठीक काम करता है। लेकिन मैं ऐसा नहीं करना चाहता क्योंकि मैं गतिशील रूप से वेबव्यू को स्वैप करने में सक्षम होना चाहता हूं।

+1

करता है वेबव्यू? –

उत्तर

9

जब आप WebView आप वर्तमान में आवेदन के संदर्भ का उपयोग कर रहे पैदा करते हैं। आपको गतिविधि के संदर्भ का उपयोग करना चाहिए। समस्या को हल करने के लिए, this साथ getApplicationContext() की जगह जब आप WebView पैदा करते हैं।

+0

यह टिप्पणी नहीं होनी चाहिए? मुझे लगता है कि आपको टिप्पणी जोड़ने की प्रतिष्ठा है। किसी को वोट देने से पहले टिप्पणी करने के लिए आगे बढ़ें। – kosa

+0

सच है, सच है। जवाब को संपादित किया क्योंकि मुझे लगता है कि इससे समस्या हल हो सकती है। –

+0

दुर्भाग्यवश समस्या को हल नहीं करता है। जब "इस" –

13

समस्या यहाँ है:

mWebView.setWebChromeClient(new WebChromeClient()); 

आप गतिविधि को छोड़ दिया है के बाद, वहाँ हो संभावना है कि WebChromeClient में कुछ कॉलबैक जबकि कंटेनर गतिविधि नष्ट कर दिया गया संवाद खोल की कोशिश करेंगे।
यहाँ एक समाधान है कि मेरे लिए काम करता है, बस mWebView.destroy() अपनी गतिविधि के OnDestroy() में यदि आप की जगह "getApplicationContext()" के साथ "इस" जब आप बनाने जोड़ने त्रुटि अभी भी हो

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mWebView != null) 
      mWebView.destroy(); 
    } 
संबंधित मुद्दे