美文网首页
WebView使用(二)--状态管理与常用类

WebView使用(二)--状态管理与常用类

作者: jeffrey12138 | 来源:发表于2020-08-13 17:35 被阅读0次

WebView的状态管理有五个方法:
1、onPause() 使页面当前的WebView停止
2、onResume()使页面当前的WebView恢复
3、pauseTimers()使当前页面全部的WebView停止
4、resumeTimers()是当前页面全部的WebView恢复
5、destroy()销毁WebView,这个方法很重要,因为尝试在销毁Activity的时候发现,WebView并没有销毁,这样会导致内存泄漏的问题

@Override
    protected void onPause() {
        super.onPause();
        webView.onPause();
        /*webView.pauseTimers();*/
    }

    @Override
    protected void onResume() {
        super.onResume();
        webView.onResume();
        /*webView.resumeTimers();*/
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        webView.destroy();
    }

然后说下WebView的常用类:
主要是三个常用类:
1、WebSettings:对WebView进行配置和管理,比如,通过
WebSettings控制网页的缩放,以及缓存等等;
2、WebViewVClient:处理webview加载时的各种回调通知,比如,网页在开始加载的回调,加载更多资源的回调,网页跳转时的回调等等;
3、WebChromeClient:辅助webView去处理javaScript对话框、进度等,比如网页弹出的对话框,网页的进度条等等;

现在先介绍下WebSettings的使用方法:
1、控制javaScript代码运行(这是踩坑才发现的,因为有些网页是通过javaScript控制的,而在android里面是默认不允许javaScript代码运行的,所以导致加载的网页会乱或者JS交互部分没有办法显示)
下面是没有设置WebSettings的网页:


image.png

代码如下:

public class MainActivity extends AppCompatActivity {
private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        webView=findViewById(R.id.webview);
        webView.loadUrl("http://www.baidu.com/");
        webView.setWebViewClient(new WebViewClient());
        
    }
}

而添加了之后:

WebSettings webSettings=webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
image.png

2、控制网页的缩放

//设置支持缩放功能
        webSettings.setSupportZoom(true);
        //设置支持内置的缩放控件
        webSettings.setBuiltInZoomControls(true);
        //设置显示原生的缩放控件
        webSettings.setDisplayZoomControls(true);

3、控制webview的缓存方式

//永远不使用网络,只去本地缓存,没有缓存则不会加载
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);
        //只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        //系统默认的缓存方法,根据cache-control决定是否从网络获取
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        //永远不适用缓存,只从网络获取最新的内容
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
//清除缓存的方法
        webView.clearCache(true);

注意:第1和2条代码的使用,有个使用弊端,就是只要本地有缓存都会去使用本地缓存,而不管网页的有啥变化,
然后cache-control可能小伙伴会有点疑惑,就大概解释下:
这个是在nodejs中实现的,node的是体现在app.js中代码

这句的意思是控制缓存时间为10秒
app.use(cacheControl({
    maxAge 10
}));

那这个的实际影响是什么呢?也就是说,如果网页内容发生了变化,但是我们在客户端上面如果在10秒之内刷新的话,是看不到新的变化,但是过了10秒之后再刷新就可以看到了

然后继续说下WebViewVClient:
在我们使用webview的过程中,如果没有加入

webView.setWebViewClient(new WebViewClient());

这句代码的时候,发现webview依然可以正常加载,但是如果我们在去使用它跳转其他网页的时候,你会发现,打开的是手机默认的浏览器而不是我们的APP。

然后我们开始验证下WebViewVClient的用法:

 webView.setWebViewClient(new WebViewClient(){
            //此方法是在android5.0以上才可以使用的,但是这个request可以调用更多的方法
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+request.getUrl().toString());
                }
                return super.shouldInterceptRequest(view, request);
            }
            //此方法是任何版本都可以使用的
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                Log.e("WebViewActivity","webview->shouldInterceptRequest请求url:"+url);
                return super.shouldInterceptRequest(view, url);
            }

            //参数1:是webview自身,参数2:是进行请求的URL,参数3:在网页标签上展示的图标
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                Log.e("WebViewActivity","webview->onPageStarted 网页开始进行加载url:"+url);
                super.onPageStarted(view, url, favicon);

            }

            @Override
            public void onLoadResource(WebView view, String url) {
                Log.e("WebViewActivity","webview->onLoadResource 网页开始加载资源url:"+url);
                super.onLoadResource(view, url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                Log.e("WebViewActivity","webview->onPageFinished 网页加载完成url:"+url);
            }
        });

通过打印可以看到他们的执行顺序:

image.png

可以看到,每个控件或者网页内容,都会执行shouldInterceptRequest()->onPageStarted()->onLoadResource()->onPageFinished(),但是注意看下最后的onPageFinished()只执行了一次

地址拦截:

webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //当跳转的地址为百度的时候,拦截下来,并跳转到搜狗的网页
                if ("http://www.baidu.com/".equals(url)){
                    view.loadUrl("http://www.sogou.com/");
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }

但报错的时候,为了提升客户使用感受,我们可以在代码中进行处理:

 webView.setWebViewClient(new WebViewClient(){

            //参数2:错误的代码,参数3:错误的描述信息,参数4:访问错误的url
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                //在这里可以对于setWebViewClient发生错误的时候,进行处理动作,例如跳转到我们制定的页面之类的
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

最后,说下WebChromeClient

webView.setWebChromeClient(new WebChromeClient(){
           //获取网页加载进度
           @Override
           public void onProgressChanged(WebView view, int newProgress) {
               super.onProgressChanged(view, newProgress);
           }
           //获取网页标题
           @Override
           public void onReceivedTitle(WebView view, String title) {
               super.onReceivedTitle(view, title);
           }
           //下面三种方法是对网页弹出的三种类型的对话框进行处理, 注意下,这三个方法都是返回boolean类型的值,
           // 当返回是false的时候,就是由WebView进行处理,反之就是我们自己去处理,同时需要用result来进行调用
           @Override
           public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
               return super.onJsAlert(view, url, message, result);
           }

           @Override
           public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
               return super.onJsConfirm(view, url, message, result);
           }

           @Override
           public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
               return super.onJsPrompt(view, url, message, defaultValue, result);
           }
       });
    }

好啦!今天的介绍到了这里,希望大家都可以学得明明白白吧,我已经写得很详细了,如果大家还有疑问,可以在下方留言,我每天都会看的!!

相关文章

网友评论

      本文标题:WebView使用(二)--状态管理与常用类

      本文链接:https://www.haomeiwen.com/subject/cwwidktx.html