@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setBlockNetworkImage(false);
webViewClient.onPageFinished(view, url);
}
@Override
public void onPageCommitVisible(WebView view, String url) {
super.onPageCommitVisible(view, url);
}
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
if (request.isForMainFrame()) {
public void onReceivedHttpError(
WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
}
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
WebSettings webSetting = this.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(true);
webSetting.setDomStorageEnabled(true);
webSetting.setAppCacheEnabled(false);
webSetting.setGeolocationEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
webSetting.setDefaultTextEncodingName("utf-8");
webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSetting.setMixedContentMode(0);
}
webSetting.setUserAgentString(webSetting.getUserAgentString());
webSetting.setAllowFileAccess(true);
// webSetting.setBlockNetworkImage(true);//同步请求图片
webSetting.setBuiltInZoomControls(false);
webSetting.setLoadWithOverviewMode(true);
webSetting.setDatabaseEnabled(true);
webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
}
window.aaaa.openNotice();
webview.loadUrl("javascript:getImgSrc()");
webview.addJavascriptInterface(WebAppInterface, "aaaa");
webview.loaddata("","text/html"):
setWebChromeClient
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
if (getActivity() != null && getActivity().isFinishing()) {
if (result != null) {
result.cancel();
}
return true;
}
return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
if (getActivity() != null && getActivity().isFinishing()) {
if (result != null) {
result.cancel();
}
return false;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
Android6.0以上判断404或者500
重写WebViewClient()的onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)方法,通过状态码判断;
Android 6.0以下判断404或者500
重写WebChromeClient()的onReceivedTitle(WebView view, String title)方法,通过标题是否包含“404”,"500","error"等字符判断;
断网或者超时判断(注意404或者500等其他非断网超时情况不走这个方法)
重写WebViewClient() 的onReceivedError(WebView view, int errorCode, String description, String failingUrl)
1.先看404的情况,果然进了onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse)方法,但是问题来了,正常的页面也返回404,去查了一下官方文档,发现一个请求页面任何资源的加载都会引发HTTP ERROR都会引起该方法的回调(例如页面的内部请求图标,或者图片等),
解决方法:
通过判断当前请求的url地址request.getUrl()是否等于根url,但是有一些请求地址通过request.getUrl()获取的url不等于根url,这个目前还没找到好的办法;
3.2 6.0以下系统测试
问题
1.先看404的情况,onReceivedTitle,这个方法还是有个别服务返回的标题不包含“404”,"500","error"等字符,暂时也没有好的解决方法;
3.3 超时测试
问题:
onReceivedError监听超时情况,需要很长时间,而webview请求的超时时间也不能控制,太影响用户体验;
解决办法:
在WebViewClient的onPageStarted(改方法是每个请求地址开始时调用),开启一个线程,设置一个时间监听,当超过这个时间,加载超时页面;