onPageStarted() 被调用多次问题:
因为网址的加载过程中存在重定向问题,所以会被调用多次。 这个是不可避免的,重定向后都是一个新的网址,肯定会重新再调用 onPageStarted()
。
如果在这个方法里面涉及到一些逻辑,尽可能在这个逻辑里面加入一些判断,保证想要执行的逻辑只执行一次,这也是有益于程序的。
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
progressBar.setVisibility(VISIBLE);
progressBar.setProgress(0);
if(!isLoading) {
//isLoading 默认为false
isLoading = true;
...
...
//执行只需要执行一次的逻辑
}
}
// 然后在onPageFinished()
里
isLoading = false;
在onPageStarted() 调用 webView.canGoBack()
返回 false 问题
有时在加载网址的时候,需要对当前webview的状态进行判断,例如,自定义了一些前进、后退按钮,便需要实时的刷新按钮,需要在网址发生变化时监听webView。
在onPageStarted()里设置监听,去获取webView 的状态,但是有时会出现上述问题,明明webview是可以返回的,在onPageStarted()里获取的值为false。
解决方案: 经过测试onProgressChanged()方法的调用情况,发现在网络的加载进度在30%左右以后,canGoBack()
才返回 true
;所以可以在onProgressChanged() 里加入监听,或是在onPageFinished()里去监听 webView的状态。
在onPageFinished() 里去设置progressBar 不可见,仍然看到进度条显示出来。
问题出现的原因,有些不清楚为什么,但是在设置的时候更改为以下便可以。
progressBar.setVisibility(View.GONE);
所以在自行设置的时候,可以设置progressBar 为GONE
而不是INVISIBLE
;
在一些低版本上,会出现webview 销毁时 程序发生crash的情况:
此类情况的出现,往往是webview销毁时出现了问题,可以仔细检查下自己代码的编写。
webView销毁代码示例:
if (webView != null) {
// 要首先移除
removeView(webView);
// 清理缓存
webView.stopLoading();
webView.onPause();
webView.clearHistory();
webView.clearCache(true);
webView.clearFormData();
webView.clearSslPreferences();
WebStorage.getInstance().deleteAllData();
webView.destroyDrawingCache();
webView.removeAllViews();
// 最后再去webView.destroy();
webView.destroy();
}
若是 webView.destroy()
放在了前面,则就会出现错误,需要把webView.destroy()
放在最后面。
网友评论