android学习笔记----WebView的url跳转时方法执行顺序体会
发布日期:2021-06-30 19:56:36 浏览次数:2 分类:技术文章

本文共 7547 字,大约阅读时间需要 25 分钟。

先上一部分代码:

MainActivity.java

import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.EditText;public class MainActivity extends AppCompatActivity {    private EditText editText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.edittext);    }    public void click(View view) {        switch (view.getId()) {            case R.id.button1:                Intent intent = new Intent(this, WebViewActivity.class);                intent.putExtra("url", editText.getText().toString());                startActivity(intent);                break;            case R.id.button2:                Intent intent1 = new Intent(this, WebViewActivity.class);                intent1.putExtra("url", "https://www.google.com/");                startActivity(intent1);                break;            default:        }    }}

测试图: 

 WebViewActivity.java(这段代码访问google的时候有点问题,后续说明)

import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.webkit.WebResourceError;import android.webkit.WebResourceRequest;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.ProgressBar;import android.widget.Toast;public class WebViewActivity extends AppCompatActivity {    private static final String TAG = "WebViewActivity";    private WebView webView;    private WebViewClient webViewClient = new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {            Log.d(TAG, "======shouldOverrideUrlLoading: " + view.getUrl());            if (view.getUrl().equals("https://www.google.com/")) {            // !!!=======如果写在这里将永远得不到执行,访问国外网站根本不回调shouldOverrideUrlLoading                Toast.makeText(WebViewActivity.this, "国内无法访问国外的网站", Toast.LENGTH_SHORT).show();                return true;// 停止继续加载该url            }            return super.shouldOverrideUrlLoading(view, request);// 默认返回false继续加载        }        @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {// 可能涉及重定向导致再次调用此方法            Log.d(TAG, "========onPageStarted: " + url);            progressBar.setVisibility(View.VISIBLE);        }        @Override        public void onPageFinished(WebView view, String url) {            Log.d(TAG, "========onPageFinished: ");            progressBar.setVisibility(View.GONE);        }    };    private ProgressBar progressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_web_view);        webView = (WebView) findViewById(R.id.webview);        progressBar = (ProgressBar) findViewById(R.id.progressbar);        WebSettings webSettings = webView.getSettings();        webSettings.setJavaScriptEnabled(true);// 加上这句很重要,否则加载不全网页效果        webView.setWebViewClient(webViewClient);        Intent intent = getIntent();        String url = completeUrl(intent.getStringExtra("url"));        Log.d(TAG, "=======onCreate: url:" + url);        webView.loadUrl(url);    }    private String completeUrl(String url) {        if (!url.substring(0, 7).equals("http://") && !url.substring(0, 8).equals("https://")) {            return "http://" + url;        }        return url;    }}

荣耀v9(8.0.0)真机结果:(在模拟器上往往会出现shouldOverrideUrlLoading在onPageStarted前面的情况)

所以在这里,得出的结论是

当访问的目标地址需要重定向的时候:

方法的执行顺序:onPageStarted()-->shouldOverrideUrlLoading()-->onPageStarted()-->onPageFinished()。多一次重定向就多一个onPageStarted()。

当访问的目标地址不需要重定向的时候:

方法的执行顺序:onPageStarted()-->onPageFinished()

 

这又有了一个问题,当我点击第二个按钮访问google的时候,出现了问题! 没有很快执行onPageFinished(),网页没加载出来,我们想要提醒用户国内无法访问google,但是似乎shouldOverrideUrlLoading的           

if (view.getUrl().equals("https://www.google.com/")) {

        Toast.makeText(WebViewActivity.this, "国内无法访问google", Toast.LENGTH_SHORT).show();
        return true;// 停止继续加载该url
}

没有得到执行。

等了一会才出现下图:

 

于是乎,我加了一个让人很匪夷所思的空方法!!!

super.onPageStarted(view, url, favicon);//点进去看这个方法是空的。

public void onPageStarted(WebView view, String url, Bitmap favicon) {// 可能涉及重定向导致再次调用此方法            Log.d(TAG, "========onPageStarted: " + url);            progressBar.setVisibility(View.VISIBLE);            super.onPageStarted(view, url, favicon);//!!====少了这一句加载国外网站需要等待很久,加上立马显示不能访问google        }

 WebViewActivity.java的代码变化如下:

import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.webkit.WebResourceError;import android.webkit.WebResourceRequest;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.ProgressBar;import android.widget.Toast;public class WebViewActivity extends AppCompatActivity {    private static final String TAG = "WebViewActivity";    private WebView webView;    private WebViewClient webViewClient = new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {            Log.d(TAG, "======shouldOverrideUrlLoading: " + view.getUrl());            return super.shouldOverrideUrlLoading(view, request);// 默认返回false继续加载        }        @Override        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {            Log.d(TAG, "======onReceivedError: ");            super.onReceivedError(view, request, error);            if (view.getUrl().equals("https://www.google.com/")) {                Toast.makeText(WebViewActivity.this, "国内无法访问国外的网站", Toast.LENGTH_SHORT).show();            }        }        @Override        public void onPageStarted(WebView view, String url, Bitmap favicon) {// 可能涉及重定向导致再次调用此方法            Log.d(TAG, "========onPageStarted: " + url);            progressBar.setVisibility(View.VISIBLE);            super.onPageStarted(view, url, favicon);//!!====少了这一句加载国外网站需要等待很久,加上立马显示不能访问google        }        @Override        public void onPageFinished(WebView view, String url) {            Log.d(TAG, "========onPageFinished: ");            progressBar.setVisibility(View.GONE);            super.onPageFinished(view, url);        }    };    private ProgressBar progressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_web_view);        webView = (WebView) findViewById(R.id.webview);        progressBar = (ProgressBar) findViewById(R.id.progressbar);        WebSettings webSettings = webView.getSettings();        webSettings.setJavaScriptEnabled(true);// 加上这句很重要,否则加载不全网页效果        webView.setWebViewClient(webViewClient);        Intent intent = getIntent();        String url = completeUrl(intent.getStringExtra("url"));        Log.d(TAG, "=======onCreate: url:" + url);        webView.loadUrl(url);    }    private String completeUrl(String url) {        if (!url.substring(0, 7).equals("http://") && !url.substring(0, 8).equals("https://")) {            return "http://" + url;        }        return url;    }}

方法执行如下,立马显示不能执行。

如果需要加载自定义的错误界面,嫌弃诸如下面的界面太丑的话,可以自己写界面在onReceivedError方法进行操作,这样也不会暴露url。访问异常的情况比如404都会回调onReceivedError方法,正常情况下不会回调。

 

============Talk is cheap, show me the code==============

转载地址:https://liuchenyang0515.blog.csdn.net/article/details/88245097 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:关于原型链的心得体会
下一篇:程序员小灰的漫画算法和知识总结,高品质强推!!!

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月05日 13时45分48秒