7.5.3 Android 4.4后WebView的一些注意事项

晚间偷亲

7.5.3 Android 4.4后WebView的一些注意事项

分类 Android 基础入门教程

本节引言:


1.多线程

runOnUiThread(newRunnable(){
@Override
publicvoid run(){
   // Code for WebView goes here
   }
});

2.线程阻塞

// 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() 方法

示例

mWebView.evaluateJavascript(script, new ValueCallback<String>() {
 @Override
 public void onReceiveValue(String value) {
      //TODO
 }
});

4.处理WebView中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变化

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()的注意事项

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


上一节中N5读取联系人的问题解决:

7.5.3 Android 4.4后WebView的一些注意事项

但是,加完以后,并没有和我们的预想一样,出现我们想要的联系人列表,这是为什么呢? 我们通过查看Log发现下面这样一段信息:

7.5.3 Android 4.4后WebView的一些注意事项

大概的意思就是:所有的WebView方法都应该在同一个线程程中调用,而这里的contactlist方法却在 JavaBridge线程中被调用了!所以我们要要把contactlist里的东东写到同一个线程中,比如一种解决 方法,就是下面这种:

7.5.3 Android 4.4后WebView的一些注意事项

嘿嘿,接下来运行下程序,神奇的发现,我们N5的手机联系人可以读取到了~

7.5.3 Android 4.4后WebView的一些注意事项

同理,之前第一个示例也可以这样解决~


本节小结:

版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com

目录[+]

取消
微信二维码
微信二维码
支付宝二维码