Webview的使用和注意事项

1.webView是一个展示web网页的控件,继承 AbsoluteLayout

2.webview的俩个回调应用层:

1)webViewClient 这个对象的创建

  WebViewClient myWibviewVlient=new WebViewClient(){  

  /*当内核开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。

  */

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) { } /*
*
  参数说明:
  @param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
  @param url    即将要被加载的url
  @return  true 当前应用程序要自己处理这个url, 返回false则不处理。
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 消耗掉这个事件。Android中返回True的即到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉
mWebView.loadUrl(url);
return true;
} @Override
public void onPageFinished(WebView view, String url) { } @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
//handler.cancel(); // Android默认的处理方式
handler.proceed(); // 接受所有网站的证书
// handleMessage(Message msg); // 进行其他处理
} @Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
dismissLoadingProgress();
}

};

2)WebChromeClient

(暂时没有用过,就不给大家分享了)

 

3.loadData与loadDataWithBaseURL的区别

在写WebView时,感觉LoadUrl太浪费流量,而且加载起来有点慢,就考虑用其它的方法来实现。在加载页面时,如果只加载数据,页面模板提前写好放到项目中,这样就可以来更快的加载页面,用户体验会好些。

如果不用loadUrl,省下的就只有LoadData和loadDataWithBaseURL了,下面来说下LoadData和loadDataWithBaseURL 的用法;

loadData:

public void loadData (String data, String mimeType, String encoding)

data:是要加载的数据类型,但在数据里面不能出现英文字符:'#', '%', '\' , '?' 这四个字符,如果有的话可以用 %23, %25, %27, %3f,这些字符来替换,在平时测试时,你的数据时,你的数据里含有这些字符,但不会出问题,当出问题时,你可以替换下。

%,会报找不到页面错误,页面全是乱码。乱码样式见符件。

#,会让你的goBack失效,但canGoBAck是可以使用的。于是就会产生返回按钮生效,但不能返回的情况。

\ 和? 我在转换时,会报错,因为它会把\当作转义符来使用,如果用两级转义,也不生效,我是对它无语了。

我们在使用loadData时,就意味着需要把所有的非法字符全部转换掉,这样就会给运行速度带来很大的影响,因为在使用时,在页面stytle中会使用很多%号。页面的数据越多,运行的速度就会越慢。

data中,有人会遇到中文乱码问题,解决办法:参数传"utf-8",页面的编码格式也必须是utf-8,这样编码统一就不会乱了。别的编码我也没有试过。

public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

在使用loadDataWithBaseURL时,需要注意的就是 baseUr:虽然API上写的是要传一个Url,但我在用时,发现传一个Url并不可以,我发现这个就是一个标志位,用来标志当前页面的Key值的,而historyUrl就是一个value值,在加载时,它会把baseUrl和historyUrl传到List列表中,当作历史记录来使用,当前进和后退时,它会通过baseUrl来寻找historyUrl的路径来加载historyUrl路径来加载历史界面,需要注意的就是history所指向的必须是一个页面,并且页面存在于SD卡中或程序中(assets),loadDataWithBaseURL,它本身并不会向历史记录中存储数据,要想实现历史记录,需要我们自己来实现,也许是我的技术有限,我有了比较笨的访求来实现:就是在加载页面时,我把数据另外的写到一个html页面中,并把它保存到SD中,当点击返回时,它会通过historyUrl指向的路径来加载页面,这样就解决了历史记录问题。

当然baseUrl和historyUrl都可以为空

上面这两种方法,我建议使用后者,虽然loadData的历史记录不需要我们自己来实现,但在使用时,我们必须把所有的%,#,\,?转换掉,在转换时,也许会遇到别的困难,我也没有测完。这就两个加载上后者比前者快一到两倍。

       

上一篇:Confluence 6 反向跟踪


下一篇:利用ASP.NET一般处理程序动态生成Web图像(转)