2012-12-29 77 views
3

我正在使用Android WebView加載一些網頁。就我而言,我必須在加載網頁之前插入一些JavaScript代碼。如下所示:如何在加載新請求之前完全重置Android webview

//enable javascript 
mWebView.getSettings().setJavaScriptEnabled(true); 

//inject my js first. 
//I can't inject the js onPageStarted() or onPageFinished() because I need to make sure the js 
//is injected before html loaded. 
mWebView.loadUrl("javascript:MyJsCode"); 

//load HTML  
mWebView.loadUrl("http://example.com/demos/index.html"); 

該代碼首次運行正常,但運行一次後失敗。因爲HTML找不到我的JS。

我想因爲之前的HTML並不完全清晰,所以mWebView.loadUrl("javascript:MyJsCode")注入MyJsCode到以前的HTML而不是新的HTML。

所以我想如果我可以完全重置WebView(to clear the previous HTML),將解決我的問題。我試過WebView.ClearView(), loadUrl("about:blank"),它們都不起作用。

任何建議?

+1

只是一個問題..你在Android 4.1上運行它嗎? –

+0

在Android 2.3和4.1上重現。 –

+0

我不是2.3,但是我遇到了Android 4.1的一個bug。無論何時在WebView上執行Javascript,Webview都會拒絕執行任何操作,直到應用程序重新啓動爲止。這在2.3.3或4.0.3上沒有發生,所以也許你的問題是不同的。 –

回答

2

我認爲沒有辦法做到這一點,除了重新新建一個WebView。

5

雖然晚了一點,但我提供了以下內容。也許這可能會有所幫助。 。 。

您的問題沒有具體提及使用WebChromeClient中的任何回調,但您提到了JS,因此以下內容可能會有所幫助。在SDK級別16及以下版本中,您可以使用回調而不特別「清除」它們。但是,從SDK級別17開始,我觀察到您必須採取措施清除事件 - 特別是alert(),如果覆蓋它,當然會導致onJSAlert()在您的WebChromeClient中被觸發。在我已經在SDK級別16及以下測試的所有設備中,您可能會輕鬆地忽略回調,並且所有設備都將按計劃進行。

然而,你會注意到onJSAlert,重寫時,提供的最後一個參數JSResult對象,即:

布爾 onJsAlert(的WebView觀點,字符串網址,字符串消息,JsResult結果)

我觀察到JsResult對象有兩種方法曝光,從而:

公共方法

最終空隙取消()

Handle the result if the user cancelled the dialog. 

最終空隙確認()

Handle a confirmation response from the user 

假設一個回調返回(表明回調消耗的onJsAlert事件),並假設你正在使用SDK十六日或之前,那麼WebView.destroy()會做預期的東西。然而,我注意到,SDK 17(4.2.x)似乎想要一些進一步的證據,表明回調在處理事件時的確如此。未能撥打result.cancel()result.confirm(),將使您的WebView(或更多點,WebViewCore)永久卡住。我已經嘗試過的任何東西都不會再喚醒WebViewCore,此後,在任何WebView,新的或其他情況下都不會加載任何東西。 (試圖解釋:WebView僅僅是一個包裝類WebViewProvider,它依次是WebViewCore對象,它是最後一個工作夥伴WebViewCore,完成所有工作。通過漫遊源代碼並通過反射,您可以挖掘方向如果你渴望這樣做,WebViewCore是一個static,因此,整個應用程序只有一個WebViewCore.Ergo,如果你的一個和唯一的WebViewCore卡住了,你的應用程序中沒有WebView然後再繼續工作,例如一旦被調用,將被卡住,直到應用程序被破壞(即暫停/恢復應用程序沒有任何效果)。即使在WebViewCore上直接調用destroy(),通過反思獲得的獲取途徑有效。注:在WebView上調用destroy()具有在WebViewCore上調用destroy()的副作用,但這也沒有幫助)。

因此,症狀是

  1. 您在onJsAlert覆蓋創建WebView
  2. 一些聰明的JS運行時,也許還稱警報()
  3. 您處理警報()方法
  4. 您無法呼叫result.confirm()result.cancel()
  5. 你破壞0​​
  6. 此後,沒有WebView在你的應用程序將加載任何東西。

好消息是,如果你一定要「清除」在任何回調的事件,你通過調用適當的方法JsResult覆蓋,那麼WebViewCore不會永久停止,你的應用程序會很高興。

+0

非常感謝~~我從你的反饋中得到了一些東西~~ –

+0

很高興它流下了一點點的光。也許upvote,如果你有時間。 –

相關問題