4

Android WebViewを使用して、いくつかの Web ページを読み込んでいます。私の場合、Web ページをロードする前にいくつかの JavaScript コードを挿入する必要があります。以下のように:

//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")、新しい HTML の代わりに以前の HTML に MyJsCode を挿入します。

そのため、を完全にリセットできればWebView(to clear the previous HTML)、問題は解決すると思いました。

私は試しましたがWebView.ClearView(), loadUrl("about:blank")、それらはすべて機能しません。

誰の提案ですか?

4

2 に答える 2

5

これは少し遅れていますが、次のことを提案します。もしかしたら参考になるかもしれません。. .

あなたの質問は、のコールバックの使用について特に言及していませんが、WebChromeClientJSについて言及しているため、以下が役立つ場合があります。SDK レベル 16 以下では、特に「クリア」しなくてもコールバックを使用できます。ただし、SDK レベル 17 以降では、イベントをクリアするために行動する必要があることがわかりalert()ましonJSAlert()WebChromeClient。私が SDK レベル 16 以下でテストしたすべてのデバイスで、コールバックを軽々しく無視しても、すべてが計画通りに進みます。

ただし、onJSAlertオーバーライドさJSResultれると、最後のパラメーターでオブジェクトが配信されることに注意してください。

boolean onJsAlert( WebViewビュー、文字列URL、文字列メッセージ、JsResult結果)

JsResult オブジェクトには 2 つのメソッドが公開されていることがわかります。

公開メソッド

最終無効 キャンセル()

Handle the result if the user cancelled the dialog.

最終ボイド 確認()

Handle a confirmation response from the user

コールバックでtrueが返されると仮定すると(コールバックが onJsAlert イベントを消費したことを示します)、SDK 16 以前を使用していると仮定するとWebView.destroy()、期待どおりのことが行われます。

ただし、SDK 17 (4.2.x) では、コールバックが実際にイベントを処理したことをさらに証明する必要があるようです。result.cancel()またはの呼び出しに失敗するとresult.confirm()、あなたのWebView(または、より正確には、WebViewCore) が永久にスタックしたままになります。私が試したことはもありWebViewCoreません. (試みられた説明:は単に のラッパー クラスであり、これは次にオブジェクトをインスツルメントします。すべての作業を行うのは最後の仲間です。ソース コードをさまよったり、リフレクションを行ったりすることで、そのオブジェクトに自分の道を掘り下げることができます。もしあなたがそうしたいと思っているなら. はです.WebViewWebViewWebViewProviderWebViewCoreWebViewCoreWebViewCorestaticWebViewCoreあなたのアプリケーション全体のために。したがって、唯一無二の WebViewCore が動かなくなった場合WebView、アプリケーションの no はその後動作しません。たとえば、JSResultメソッドが呼び出されるのを待ってスタックすると、アプリケーションが破棄されるまでスタックします (つまり、アプリを一時停止/再開しても効果はありません)。リフレクションによって得られたアクセスを介してdestroy()、直接呼び出しても効果はありません。WebViewCore注意: を呼び出すdestroy()と、WebViewを呼び出す副作用がありますがdestroy()WebViewCoreこれも役に立ちません)。

つまり、その症状は

  1. あなたはWebView
  2. いくつかの巧妙な JS の実行、おそらくalert()の呼び出し
  3. オーバーライド メソッドでalert()を処理しますonJsAlert
  4. result.confirm()あなたはどちらかを呼び出すことができませんresult.cancel()
  5. あなたは破壊するWebView
  6. その後、WebViewアプリケーションの no は何もロードしません。

良いニュースは、適切な JsResult メソッドを呼び出してオーバーライドするコールバックのイベントを確実に「クリア」する場合、WebViewCoreが永久に停止することはなく、アプリケーションが満足することです。

于 2013-03-26T12:57:10.723 に答える
4

WebViewを新しくする以外にこれを行う方法はないと思います。

于 2013-01-11T07:08:19.320 に答える