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响应头影响浏览器的行为才能间接地影响到这些缓存数据。
3066 0
|
7月前
|
JavaScript 前端开发 网络协议
前端JS发起的请求能暂停吗?
在讨论前端JS发起的请求是否能暂停时,需要明确两个概念:什么状态可以被认为是“暂停”?以及什么是JS发起的请求?
494 1
前端JS发起的请求能暂停吗?
|
7月前
|
Android开发 UED Kotlin
kotlin webview 加载网页失败后如何再次重试
在Kotlin中,当使用WebView加载网页失败时,可通过设置WebViewClient并覆盖`onReceivedError`方法来捕获失败事件。在该回调中,可以显示错误信息或尝试使用`reload()`重试加载。以下是一个简要示例展示如何处理加载失败
|
8月前
Appium设置会话时长,解决调试代码时session失效的问题
Appium设置会话时长,解决调试代码时session失效的问题
208 0
|
运维 网络虚拟化
阿里云RPA中,控件超时
阿里云RPA中,控件超时
580 1
|
前端开发 API 定位技术
Android webview加载https链接错误或无响应
Android webview加载https链接错误或无响应
|
API iOS开发
iOS多个线程发起相同请求,避免重复
有时候在调用多个模块时,会对同一个API进行多次请求,但因为内容都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费
220 0
|
Android开发
WebView需要销毁
WebView需要销毁
779 0
|
JSON 小程序 数据格式
小程序下拉刷新没有响应
小程序下拉刷新没有响应
304 0