您的位置:首页 > 移动开发

WebView问题总结

2014-05-19 17:17 351 查看
1.webView 点击连接如何不让跳转到系统的 浏览器,而是在这个webview里进行切换页面

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


但官方暂时未有进一步回答。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: