WebView问题总结
2014-05-19 17:17
351 查看
1.webView 点击连接如何不让跳转到系统的 浏览器,而是在这个webview里进行切换页面
2.如果网络不好,在webView加载某个网址时速度很慢,我有个动画让用户等待,但如何监听到WebView已经加载完成了呢?
加载时使用:
webView.loadUrl("http://www.ifeng.com");
步骤:
1 创建 一个 自己的WebViewClient(继承 WebViewClient 类)如 MyWebviewclient
2 重载 里面的 onPageFinished(WebView view, String url)方法,(webview加载完成会调用这个方法),这个方法放自己想要做的事情,在webview加载完成以后
3 关联 你自己的webviewclient 与 webview 通过 这个方法:webView.setWebViewClient( new MyViewerWebViewClient();
如果要监视加载进度的,需要创建一个自己的WebChromeClient类,并重载方法onProgressChanged,再webview.setWebChromeClient(new MyWebChromeClient())即可:
class MyWebChromeClient extends WebChromeClient
{
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
}
(3)
1、映射Java对象到JavaScript对象上
mWebView =
(WebView) findViewById(R.id.wv_content);
mWebView.setVerticalScrollbarOverlay(true);
final WebSettings settings = mWebView.getSettings();
settings.setSupportZoom(true);
//WebView启用Javascript脚本执行
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
//映射Java对象到一个名为”js2java“的Javascript对象上
//JavaScript中可以通过"window.js2java"来调用Java对象的方法
mWebView.addJavascriptInterface(new JSInvokeClass(),
"js2java");
/**网页Javascript调用接口**/
class JSInvokeClass {
public void back()
{
activity.finish();
}
}
2、JavaScript调用Java对象示例
调用上述JSInvokeClass类对象的back方法,如下:
window.js2java.back();
<------------------------------------------------------------------------------>
<!-- 最近接触WebView比较多,总结一下使用过程中遇到的一些问题和解决办法 -->
1. WebView无法缓存(Cache)
如果页面的Header包含了以下字段就会导致无法缓存(具体可参考CacheManger.parseHeaders()方法):
Cache-Control: no-store, no-cache
Pragma: no-cache
需要由服务器更改页面属性解决。
2. WebView.getFavIcon()无法获取到页面图标
必须先执行以下操作(打开图标数据库):
WebIconDatabase. getInstance ().open(getDir( "icons" , MODE_PRIVATE ).getPath());
<参考链接>
3. WebViewClient.shouldOverLoadingUrl()方法有时不会被回调
我是在访问百度手机版切换为传统版时遇到的,页面 最下面的<传统版>切换:
<a href="http://video.baidu.com/index.html?fr=video" target="_blank">传统版</a>
网上搜集到讨论该问题的一些链接:
second call to WebView.loadUrl() no longer calls WebViewClient.shouldOverrideUrlLoading
Issue 812:WebViewClient#shouldOverrideUrlLoading() not called for local-looking links
Issue 9122:WebViewClient::shouldOverrideUrlLoading dont catch form interactions with method="POST"
shouldOverrideUrlLoading(…) not executed if “window.location.href” modified in a timeout callback
目前还没法办解决,对于想截获地址并禁止其访问的,可以在WebViewClient.onPageStart()里处理:
class MyWebViewClient extends WebViewClient {
/**
* 网页开始加载
*/
public void onPageStarted(WebView view, String url, Bitmap favicon){
if ( IsIgnoreWebsite (url)){
view.stopLoading();
// 提示网页被屏蔽?
return ;
}
}
}
[b]4. 垂直滚动条总是显示白色轨迹底图(无法消掉)[/b]
在xml中给WebView设置一下属性发觉不起一点作用:
android:fadeScrollbars = "true"
android:scrollbarStyle = "outsideOverlay"
android:scrollbarAlwaysDrawVerticalTrack = "false"
必须在代码中对WebView进行设置才能奏效:
webview .setScrollbarFadingEnabled( true );
webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
[b][b]5. [/b]加载报错(无法创建数据库导致空指针)[/b]
这不是必然的。我的情况是,我有两个应用使用到WebView,代码都是一样的,但是其中一个死活报错 。
什么都不做,仅仅构造了WebView对象:
sqlite returned: error code = 14, msg = cannot open file at source line 25467
sqlite3_open_v2("/data/data/com.demo.webview/databases/webview.db", &handle, 6, NULL) failed
sqlite returned: error code = 14, msg = cannot open file at source line 25467
sqlite3_open_v2("/data/data/com. demo .webview/databases/webviewCache.db", &handle, 6, NULL) failed
使用load加载网页,加载完毕时报错:
FATAL EXCEPTION: WebViewWorkerThread
java.lang.NullPointerException
at android.webkit.WebViewDatabase.getCacheTotalSize(WebViewDatabase.java:734)
at android.webkit.CacheManager.trimCacheIfNeeded(CacheManager.java:548)
at android.webkit.WebViewWorker.handleMessage(WebViewWorker.java:190)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
初步分析:
这是因为底层库打开数据库时失败,导致进一步调用该数据库对象进行操作,抛出空指针错误。
目前已尝试的解决方式:
1.捕获抛出的异常 —— 无法捕获到。
*在Android的Bug反馈中也找到了该问题:
Issue 11977:WebView: NPE in getTotalCacheSize()
Issue 10789:WebView crashes due to NPE
但官方暂时未有进一步回答。
webview.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return false; } });
2.如果网络不好,在webView加载某个网址时速度很慢,我有个动画让用户等待,但如何监听到WebView已经加载完成了呢?
加载时使用:
webView.loadUrl("http://www.ifeng.com");
步骤:
1 创建 一个 自己的WebViewClient(继承 WebViewClient 类)如 MyWebviewclient
2 重载 里面的 onPageFinished(WebView view, String url)方法,(webview加载完成会调用这个方法),这个方法放自己想要做的事情,在webview加载完成以后
3 关联 你自己的webviewclient 与 webview 通过 这个方法:webView.setWebViewClient( new MyViewerWebViewClient();
如果要监视加载进度的,需要创建一个自己的WebChromeClient类,并重载方法onProgressChanged,再webview.setWebChromeClient(new MyWebChromeClient())即可:
class MyWebChromeClient extends WebChromeClient
{
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
}
(3)
Android中WebView实现Javascript调用Java类方法
为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。1、映射Java对象到JavaScript对象上
mWebView =
(WebView) findViewById(R.id.wv_content);
mWebView.setVerticalScrollbarOverlay(true);
final WebSettings settings = mWebView.getSettings();
settings.setSupportZoom(true);
//WebView启用Javascript脚本执行
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
//映射Java对象到一个名为”js2java“的Javascript对象上
//JavaScript中可以通过"window.js2java"来调用Java对象的方法
mWebView.addJavascriptInterface(new JSInvokeClass(),
"js2java");
/**网页Javascript调用接口**/
class JSInvokeClass {
public void back()
{
activity.finish();
}
}
2、JavaScript调用Java对象示例
调用上述JSInvokeClass类对象的back方法,如下:
window.js2java.back();
<------------------------------------------------------------------------------>
<!-- 最近接触WebView比较多,总结一下使用过程中遇到的一些问题和解决办法 -->
1. WebView无法缓存(Cache)
如果页面的Header包含了以下字段就会导致无法缓存(具体可参考CacheManger.parseHeaders()方法):
Cache-Control: no-store, no-cache
Pragma: no-cache
需要由服务器更改页面属性解决。
2. WebView.getFavIcon()无法获取到页面图标
必须先执行以下操作(打开图标数据库):
WebIconDatabase. getInstance ().open(getDir( "icons" , MODE_PRIVATE ).getPath());
<参考链接>
3. WebViewClient.shouldOverLoadingUrl()方法有时不会被回调
我是在访问百度手机版切换为传统版时遇到的,页面 最下面的<传统版>切换:
<a href="http://video.baidu.com/index.html?fr=video" target="_blank">传统版</a>
网上搜集到讨论该问题的一些链接:
second call to WebView.loadUrl() no longer calls WebViewClient.shouldOverrideUrlLoading
Issue 812:WebViewClient#shouldOverrideUrlLoading() not called for local-looking links
Issue 9122:WebViewClient::shouldOverrideUrlLoading dont catch form interactions with method="POST"
shouldOverrideUrlLoading(…) not executed if “window.location.href” modified in a timeout callback
目前还没法办解决,对于想截获地址并禁止其访问的,可以在WebViewClient.onPageStart()里处理:
class MyWebViewClient extends WebViewClient {
/**
* 网页开始加载
*/
public void onPageStarted(WebView view, String url, Bitmap favicon){
if ( IsIgnoreWebsite (url)){
view.stopLoading();
// 提示网页被屏蔽?
return ;
}
}
}
[b]4. 垂直滚动条总是显示白色轨迹底图(无法消掉)[/b]
在xml中给WebView设置一下属性发觉不起一点作用:
android:fadeScrollbars = "true"
android:scrollbarStyle = "outsideOverlay"
android:scrollbarAlwaysDrawVerticalTrack = "false"
必须在代码中对WebView进行设置才能奏效:
webview .setScrollbarFadingEnabled( true );
webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
[b][b]5. [/b]加载报错(无法创建数据库导致空指针)[/b]
这不是必然的。我的情况是,我有两个应用使用到WebView,代码都是一样的,但是其中一个死活报错 。
什么都不做,仅仅构造了WebView对象:
sqlite returned: error code = 14, msg = cannot open file at source line 25467
sqlite3_open_v2("/data/data/com.demo.webview/databases/webview.db", &handle, 6, NULL) failed
sqlite returned: error code = 14, msg = cannot open file at source line 25467
sqlite3_open_v2("/data/data/com. demo .webview/databases/webviewCache.db", &handle, 6, NULL) failed
使用load加载网页,加载完毕时报错:
FATAL EXCEPTION: WebViewWorkerThread
java.lang.NullPointerException
at android.webkit.WebViewDatabase.getCacheTotalSize(WebViewDatabase.java:734)
at android.webkit.CacheManager.trimCacheIfNeeded(CacheManager.java:548)
at android.webkit.WebViewWorker.handleMessage(WebViewWorker.java:190)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
初步分析:
这是因为底层库打开数据库时失败,导致进一步调用该数据库对象进行操作,抛出空指针错误。
目前已尝试的解决方式:
1.捕获抛出的异常 —— 无法捕获到。
*在Android的Bug反馈中也找到了该问题:
Issue 11977:WebView: NPE in getTotalCacheSize()
Issue 10789:WebView crashes due to NPE
但官方暂时未有进一步回答。
相关文章推荐
- Android WebView常见问题的解决方案总结----例如Web page not available
- WebView使用时需要注意的细节问题(持续总结)
- Android WebView 使用和问题总结
- Android WebView常见问题的解决方案总结----例如Web page not available
- iOS webview加载时序和缓存问题总结
- H5微信支付webview设置referer无效问题总结
- WebView问题总结
- android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
- ScrollView 嵌套 WebView 遇到的一些界面问题总结
- WebView常见问题总结
- [开发总结]WebView使用中遇到的一些问题&解决
- Android WebView常见问题总结
- Android WebView 使用过程中遇到的问题与总结
- 关于WebView的总结2---使用方法及常见问题和解决方案汇总
- 详解iOS webview加载时序和缓存问题总结
- 安卓webview与js交互 问题总结
- Android WebView系列文章4 WebView的问题总结
- webview的简单总结(最近面试遇到好多这方面的问题)
- Android WebView常见问题总结
- [开发总结]WebView使用中遇到的一些问题&解决