android webview对shouldOverrideUrlLoading的理解,对于重定向的url

webView.getSettings().setJavaScriptEnabled(true);//支持js
webView.setWebChromeClient(new ChromeClient());//对js交互的对话框、title以及页面加载进度条的管理
webView.setWebViewClient(new WebViewClient());//对webview页面加载管理、如url重定向
webView.addJavascriptInterface(null, "game");
webView.clearCache(true);//支持缓存
class ChromeClient extends WebChromeClient {

		@Override
		public void onShowCustomView(View view, CustomViewCallback callback) {
			super.onShowCustomView(view, callback);
			Log.e("tag", "on Show Custom View >>>>>webView");

		}

		@Override
		public void onProgressChanged(WebView view, int newProgress) {
			super.onProgressChanged(view, newProgress);
			mProgressBar.setProgress(newProgress);
			if (newProgress == mProgressBar.getMax()) {
				mProgressBar.setVisibility(View.GONE);
			} else {
				mProgressBar.setVisibility(View.VISIBLE);
			}
		}

	}

重写webVIewClinet:

class WebClient extends WebViewClient {

		
		@Override
		public void onLoadResource(WebView view, String url) {
			super.onLoadResource(view, url);
			Log.v("tag", "url = " + url);
		}

		@Override
		public void onReceivedError(WebView view, int errorCode,
				String description, String failingUrl) {
			Logcat.dLog("errorCode = "+errorCode);
			super.onReceivedError(view, errorCode, description, failingUrl);
		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {//webview页面加载开始时就会执行此方法、一般用作重定向时的初始化工作
			super.onPageStarted(view, url, favicon);
		}

		/**
		 * url重定向会执行此方法以及点击页面某些链接也会执行此方法
		 * 
		 * @param view
		 *            当前webview
		 * @param url
		 *            即将重定向的url
		 * @return true:表示当前url已经加载完成,即使url还会重定向都不会再进行加载 false 表示此url默认由系统处理,该重定向还是重定向,直到加载完成
		 */
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {

			if (!Tools.urlCheck(url)) {
				return true;
			}
			if (!TextUtils.isEmpty(url) && url.endsWith("apk")) {
				Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
				startActivity(viewIntent);
			} else {
				if (!WebViewActivity.processCustomUrl(WebActivity.this, url, null, false)) {
					url = WebViewActivity.addCookie2Url(WebActivity.this, url);
					// view.loadUrl(url);//(步骤一)
					// return true;//(步骤二)
				} else {
					return true;
				}
			}
			Logcat.dLog("url loading = " + url);
			return super.shouldOverrideUrlLoading(view, url);//(步骤三)
		}

		@Override
		public void onPageFinished(WebView view, String url) {//
			if (TextUtils.isEmpty(title)) {
				title = view.getTitle();
				if (!TextUtils.isEmpty(title) && title.length() > 8) {
					title = title.substring(0, 8) + "...";
				}
				titleNameTV.setText(title);
			}
			super.onPageFinished(view, url);
		}

	}

注意:

若步骤一执行则会重新加载webView,并且不执行步骤二,则由于会执行步骤三,导致返回false,则系统也会加载一次,导致执行了两次,当执行webview.goBack()返回上一页时就会一直在当前页打转:注:这个url是重定向的url:解决办法:将步骤一和步骤二去掉(本身就是多余的代码,因为返回false系统会执行加载,没必要在执行webVIew.loadUrl(url))

若是将步骤一和步骤二去掉,由于是系统执行的重定向,默认是绑定为一个整体即一个url,当点击webView,goback(),直接返回上页(不是重定向的页面),因为系统管理的webview堆栈(通过此webView.copyBackForwardList()获得堆栈列表,实际是一个对象(包含堆栈的大小,当前加载),再由此对象下ArrayList管理)只记录重定向最初的url,所以返回的时候回直接返回到上一页



shouldOverrideUrlLoading :这个方法的返回值

      return true 表示当前url即使是重定向url也不会再执行(除了在return true之前使用webview.loadUrl(url)除外,因为这个会重新加载)

      return false  表示由系统执行url,直到不再执行此方法,即加载完重定向的ur(即具体的url,不再有重定向)


注:设置自适应则可能会导致不支持js或css导致界面布局出现错乱

// 自适应屏幕
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);




评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值