<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 本節引言: > 本節參考原文:[Android 4.4 中 WebView 使用注意事項.md](https://github.com/cundong/blog/blob/master/Android%204.4%20%E4%B8%AD%20WebView%20%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.md) > > 從Android 4.4開始,Android中的WebView不再是基于WebKit的,而是開始基于Chromium,這個改變 使得WebView的性能大幅提升,并且對HTML5,CSS,JavaScript有了更好的支持! > > 雖然chromium完全取代了以前的WebKit for Android,但Android WebView的API接口并沒有變, 與老的版本完全兼容。這樣帶來的好處是基于WebView構建的APP,無需做任何修改, 就能享受chromium內核的高效與強大。 > > 對于4.4后的WebView,我們需要注意下下面這些問題: * * * ## 1.多線程 > 如果你在子線程中調用WebView的相關方法,而不在UI線程,則可能會出現無法預料的錯誤。 所以,當你的程序中需要用到多線程時候,也請使用runOnUiThread()方法來保證你關于 WebView的操作是在UI線程中進行的: ~~~ runOnUiThread(newRunnable(){ @Override publicvoid run(){ // Code for WebView goes here } }); ~~~ * * * ## 2.線程阻塞 > 永遠不要阻塞UI線程,這是開發Android程序的一個真理。雖然是真理,我們卻往往不自覺的 犯一些錯誤違背它,一個開發中常犯的錯誤就是:在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 : ~~~ <a href="showProfile">Show Profile</a> ~~~ shouldOverrideUrlLoading() 將不會被調用。 正確的使用方式是: ~~~ <a href="example-app:showProfile">Show Profile</a> ~~~ 對應的檢測Url跳轉的方式: ~~~ // The URL scheme should be non-hierarchical (no trailing slashes) privatestaticfinalString APP_SCHEME ="example-app:"; @Override publicboolean shouldOverrideUrlLoading(WebView view,String url){ if(url.startsWith(APP_SCHEME)){ urlData =URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8"); respondToData(urlData); returntrue; } returnfalse; } ~~~ 當然,也可以這樣使用: ~~~ 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/537.36 ~~~ 使用**getDefaultUserAgent()**方法可以獲取默認的UserAgent,也可以通過: ~~~ mWebView.getSettings().setUserAgentString(ua); mWebView.getSettings().getUserAgentString(); ~~~ 來設置和獲取自定義的UserAgent。 * * * ## 6.使用addJavascriptInterface()的注意事項 > 從Android4.2開始。 只有添加 @JavascriptInterface 聲明的Java方法才可以被JavaScript調用, 例如: ~~~ class JsObject { @JavascriptInterface public String toString() { return "injectedObject"; } } webView.addJavascriptInterface(new JsObject(), "injectedObject"); webView.loadData("", "text/html", null); webView.loadUrl("javascript:alert(injectedObject.toString())"); ~~~ * * * ## 7.Remote Debugging > 新版的WebView還提供了一個很厲害的功能:使用Chrome來調試你運行在WebView中的程序 具體可以看:[remote-debugging](https://developers.google.com/chrome-developer-tools/docs/remote-debugging)?PS:需要梯子~你也可以直接百度remote-debugging了解相關信息,以及如何使用!?![](https://box.kancloud.cn/2015-12-01_565dab1f83fcc.jpg) * * * ## 上一節中N5讀取聯系人的問題解決: > 嘿嘿,看完上面的,我們知道在Android4.2后,只有添加 @JavascriptInterface 聲明的Java方法才可以被JavaScript調用,于是乎我們為之前的兩個方法加上@JavascriptInterface ![](https://box.kancloud.cn/2015-12-01_565dab1fe1ce3.jpg) 但是,加完以后,并沒有和我們的預想一樣,出現我們想要的聯系人列表,這是為什么呢? 我們通過查看Log發現下面這樣一段信息: ![](https://box.kancloud.cn/2015-12-01_565dab239f6ad.jpg) 大概的意思就是:所有的WebView方法都應該在同一個線程程中調用,而這里的contactlist方法卻在 JavaBridge線程中被調用了!所以我們要要把contactlist里的東東寫到同一個線程中,比如一種解決 方法,就是下面這種: ![](https://box.kancloud.cn/2015-12-01_565dab23b75ee.jpg) 嘿嘿,接下來運行下程序,神奇的發現,我們N5的手機聯系人可以讀取到了~ ![](https://box.kancloud.cn/2015-12-01_565dab23e257f.jpg) 同理,之前第一個示例也可以這樣解決~ * * * ## 本節小結: > 本節跟大家走了一趟Android 4.4后WebView要注意的事項,以及一些對上一節中N5問題 的解決~相信會給大家在實際開發中使用WebView帶來便利~謝謝
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看