WebView 遇到的问题

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()放在最后面。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容