WebView的超时处理

简介: main.xml如下: MainActivity如下: package c.c; import java.util.

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   <WebView 
       android:id="@+id/webView"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_centerInParent="true"
    />

</RelativeLayout>


MainActivity如下:

package c.c;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
 * Demo描述: WebView超时的处理
 */
public class MainActivity extends Activity {
	private Timer mTimer;
	private WebView mWebView;
	private TimerTask mTimerTask;
	private final int TIMEOUT = 10000;
	private final int TIMEOUT_ERROR = 9527;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == TIMEOUT_ERROR) {
				System.out.println("===》 收到消息: webView超时");
			}
		};
	};

	private void init() {
		mWebView = (WebView) findViewById(R.id.webView);
		mWebView.getSettings().setJavaScriptEnabled(true);
		mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
		mWebView.getSettings().setSupportZoom(true);
		mWebView.getSettings().setDomStorageEnabled(true);
		mWebView.getSettings().setAllowFileAccess(true);
		mWebView.getSettings().setPluginsEnabled(true);
		mWebView.getSettings().setUseWideViewPort(true);
		mWebView.getSettings().setBuiltInZoomControls(true);
		mWebView.getSettings().setLoadWithOverviewMode(true);
		mWebView.requestFocus();
		mWebView.loadUrl("your url");
		mWebView.setWebViewClient(new WebViewClient() {
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				return super.shouldOverrideUrlLoading(view, url);
			}

			@Override
			public void onLoadResource(WebView view, String url) {
				super.onLoadResource(view, url);
			}

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				super.onPageStarted(view, url, favicon);
				System.out.println("======> onPageStarted 开始加载");
				mTimer = new Timer();
				mTimerTask = new TimerTask() {
					@Override
					public void run() {
						// 在TIMEOUT时间后,则很可能超时.
						// 此时若webView进度小于100,则判断其超时
						// 随后利用Handle发送超时的消息
						System.out.println("======> mWebView.getProgress()="+ mWebView.getProgress());
						if (mWebView.getProgress() < 100) {
							Message msg = new Message();
							msg.what = TIMEOUT_ERROR;
							mHandler.sendMessage(msg);
							if (mTimer != null) {
								mTimer.cancel();
								mTimer.purge();
							}
						}
						if (mWebView.getProgress() == 100) {
							System.out.println("======> 未超时");
							if (mTimer != null) {
								mTimer.cancel();
								mTimer.purge();
							}
						}
					}
				};
				mTimer.schedule(mTimerTask, TIMEOUT, 1);
			}

			@Override
			public void onPageFinished(WebView view, String url) {
				super.onPageFinished(view, url);
				System.out.println("======> onPageFinished 加载完成");
				if (mTimer != null) {
					mTimer.cancel();
					mTimer.purge();
				}
			}
		});

	}

	// 处理Back键
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == event.KEYCODE_BACK && mWebView.canGoBack()) {
			mWebView.goBack();
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

}


 

相关文章
|
存储 缓存 Android开发
android 读取WebView缓存及清理WebView缓存
1.缓存的分类: 首先要说的一点是缓存的分类,我们缓存的数据分为:页面缓存和数据缓存 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器  的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。
3014 0
|
6月前
|
Android开发 UED Kotlin
kotlin webview 加载网页失败后如何再次重试
在Kotlin中,当使用WebView加载网页失败时,可通过设置WebViewClient并覆盖`onReceivedError`方法来捕获失败事件。在该回调中,可以显示错误信息或尝试使用`reload()`重试加载。以下是一个简要示例展示如何处理加载失败
|
运维 网络虚拟化
阿里云RPA中,控件超时
阿里云RPA中,控件超时
543 1
|
API Android开发 开发者
Android 中Okhttp的同步请求与异步请求详解
Android 中Okhttp的同步请求与异步请求详解
451 0
|
JSON 小程序 数据格式
小程序下拉刷新没有响应
小程序下拉刷新没有响应
294 0
|
算法 Android开发 Java
Android 几种异步方式,解决主线程中遇到的卡顿
起因: 当我们的UI越来越复杂的时候,或者说某个业务需要大量的计算的时候,我们的主线程会消耗大量的资源去计算,这个时候,我们的Activity或者说fragmemt等UI页面就会出现卡顿,乃至ANR。
1288 0
|
JavaScript 前端开发 Android开发