自定义404页面。android的webview 控件能够加载网页,webview有两个方法:webView.setWebChromeClient和webView.setWebViewClient。java
WebChromeClient主要处理解析,渲染网页等浏览器作的事情,辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度:
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,须要定制你的WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitleandroid
好比能够添加进度条,使得界面更友好。web
WebViewClient是帮助WebView处理各类通知、请求事件的,具体来讲包括: 浏览器
onLoadResource
onPageStart
onPageFinish
onReceiveError //这个就是咱们想要的方法
onReceivedHttpAuthRequest tomcat
那么咱们要加载自定义的404界面就要两个并用了。服务器
代码以下:app
1 webView = (WebView) findViewById(R.id.webv);//获取控件 2 webView.getSettings().setJavaScriptEnabled(true); //设置js权限,好比js弹出窗,你懂得 3 webView.getSettings().setSupportMultipleWindows(true); 4 5 webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 6 7 webView.setWebChromeClient(new MyWebChromeClient() 8 { 9 public void onProgressChanged(WebView view, int progress)//设置 加载进程10 {11 activity.setTitle("正在加载...Loading...");12 activity.setProgress(progress * 100);13 if(progress >= 100){14 new Thread(new Runnable() {15 @Override16 public void run() {17 Message msg=handler.obtainMessage();//发送通知,加入线程18 msg.what=2;//加载完成19 handler.sendMessage(msg);//通知发送!20 } 21 }).start(); 22 activity.setTitle(R.string.app_name);23 }24 }25 }26 );27 28 webView.setWebViewClient(new WebViewClient() {29 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 30 { 31 view.stopLoading();32 view.clearView();33 Message msg=handler.obtainMessage();//发送通知,加入线程34 msg.what=1;//通知加载自定义404页面35 handler.sendMessage(msg);//通知发送!36 }37 public boolean shouldOverrideUrlLoading(WebView view, String url) 38 {39 view.loadUrl(url);40 return true;41 }42 });43 webView.addJavascriptInterface(this, "javatojs");//将本activity绑定到java_js这个js当中去44 webView.loadUrl(URL);45 checkUPPay();//检测银联支付控件是否已添加46 }47 /**48 * handler处理消息机制49 */50 protected Handler handler = new Handler(){51 public void handleMessage(Message message){52 switch (message.what) {53 case 0:54 myDialog.show();55 break;56 case 1:57 webView.loadUrl(URL404);58 break;59 case 2:60 myDialog.dismiss();61 break;62 }63 }64 };
说明:虽然说这两个方法都是系统内置方法,可是连用起来仍是会出现短暂的跳转,跳转的一瞬间会看到原有的404错误页面。我了解过其余文章的分析,部分文章认为这是由于webview加载页面是经过两个线程进行的,因此当咱们收到错误消息的时候另一个线程可能就将原先的页面显示出来了。因此会有一点“闪”。ide
在使用这个方法以前我也想过其余的加载自定义界面,好比在页面加载到大于99%的时候,我检测webview的title,若是是null或“未找到页面(不一样的手机可能提示的不同)”就跳转到自定义的错误界面,一样也会出现短暂的闪出原404界面。网站
当我找到文章刚开始的方法以后果断把这个方法舍去了,由于不一样手机的提示是不同的,并且有时候tomcat或其余服务器会返回其余的错误信息,这个我也要意义检测,不光慢,也不科学。this
本人经验有限,技术拙漏,薄文仅供参考。欢迎批评指正