Android 4.4でWebViewの使用上の注意事項

2866 ワード

Android 4.4より、AndroidのWebViewはChromiumに基づくようになりました(これは、Android部門の責任者がAndy RubinからChrome部門の責任者Sundar Pichaiになったからでしょう、).
この変更により、WebViewのパフォーマンスが大幅に向上し、HTML 5、CSS 3、and JavaScriptのサポートが向上しました.
では、クライアント開発者として、コードを書くときに注意しなければならないことは何でしょうか.
1.マルチスレッド
UIスレッドではなく、サブスレッドでWebViewに関するメソッドを呼び出すと、予期せぬエラーが発生する可能性があります.
したがって、プログラムでマルチスレッドを使用する必要がある場合は、runOnUIThread()メソッドを使用して、WebViewに関する操作がUIスレッドで行われていることを保証してください.
runOnUiThread(newRunnable(){
@Override
publicvoid run(){
   // Code for WebView goes here
   }
});

2.スレッドブロック
UIスレッドをブロックしないでください.これはAndroidプログラムを開発する真理です.真理ですが、私たちは往々にしていくつかの間違いを犯してそれに背いて、1つの開発の中でよく犯す間違いは:UIスレッドの中でJavaScriptのコールバックを待つことです.
例:
// This code is BAD and will block the UI thread
webView.loadUrl("javascript:fn()"); while(result ==null){ 
Thread.sleep(100); }

決してそうしないでください.Android 4.4では、新しいApiを提供しています. 
evaluateJavascript()は、JavaScriptコードを非同期で実行するために使用されます.
3.evaluateJavascript()メソッド
JavaScriptメソッドの非同期呼び出しに特化し、コールバック結果を得ることができます.
例:
mWebView.evaluateJavascript(script, new ValueCallback<String>() {
 @Override
 public void onReceiveValue(String value) {
      //TODO
 }
});

4.WebViewにおけるurlジャンプの処理
新しいWebViewでは、カスタムschemeのurlジャンプに対して、より厳しい制限条件が追加されました. 
shouldOverrideUrlLoading()またはshouldInterceptRequest()コールバックを実現すると、WebViewもurlが合法的なUrlである場合にのみジャンプします.
たとえば、urlを使用すると、
Show Profile
shouldOverrideUrlLoading()は呼び出されません.正しい使い方は、Show Profile
対応する検出Urlジャンプの方式:
// The URL scheme should be non-hierarchical (no trailing slashes)
 private static final String APP_SCHEME ="example-app:";
 
 @Override public boolean shouldOverrideUrlLoading(WebView view,String url){
     if(url.startsWith(APP_SCHEME)){
         urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");
         respondToData(urlData);
         returntrue;
     }
     return false; }

もちろん、このように使用することもできます.
webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,
null,"UTF-8",null);
5.UserAgent変化
App対応のサービス・エンド・プログラムが、クライアントから送信されたUserAgentに基づいて異なることを行う場合は、新しいバージョンのWebViewでは、UserAgentが微妙に変更されていることに注意してください.
Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H) AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0
Mobile Safari/53.36 getDefaultUserAgent()メソッドを使用すると、デフォルトのUserAgentを取得できます.
mWebView.getSettings().setUserAgentString(ua);
mWebView.getSettings().getUserAgentString();

に表示されます.
6.Remote Debugging
新しいWebViewでは、Chromeを使用してWebViewで実行しているプログラムをデバッグするという強力な機能も提供されています.
具体的にはremote-debugging