需求是,将网页显示在webview中,但是有的时候会出出现400或者服务器无法侦测,如服务器已经停止了,但是webview还是会请求。那么这么错误都会显示在webview上面,所以我想拦截这些错误。
类似这种问题,我们可以考虑下现在市面上的浏览器的实现。比如手机上的UC浏览器,其实细心的同学会发现,在UC浏览器上,UC浏览器每次加载网页的时候都先到自已的服务器过一遍,目的是要检测目标网页是否可加载,可显示,如果不能,则返回错误指令,然后交给浏览器调用自身存在的错误提示页面,显示给用户,那他检测目标网页是否可加载是用的什么方法呢?我们知道,WEB应用程序是按照请求响应来执行和运行的,所以要直接得到状态码会有点小问题,但是我们可以得到网页内容,这个就没有什么问题,那下面我们向大家介绍下,在Android中,如何获得网页内容的方法,如下。
如果知道了一个网页的URL,在Android中用Java代码获得这个网页的Html内容其实很容易了,直接用HttpClient进行Http请求就行了,虽然简单,这里还是贴一下代码,一个很简单的例子:
import ......;
public class ThirdActivity extends Activity {
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
doGetConnect();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("click to get html");button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message); //启动线程
}
}
);
setContentView(button);
}
private String doGetConnect(){
String result = "";
InputStream is = null;
HttpGet httpRequest=new HttpGet("http://192.168.1.154:7087/index.html");
try {
HttpResponse httpResponse=new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode()==200){ //正确is = httpResponse.getEntity().getContent();
byte[] data = new byte[1024];
int n = -1;
ByteArrayBuffer buf = new ByteArrayBuffer(10*1024);
while ((n = is.read(data)) != -1)
buf.append(data, 0, n);
result= new String(buf.toByteArray(), HTTP.UTF_8);
Log.v("result==", result);
is.close();
return result;
}
else {Log.v("tip==", "error response code");}
} catch (Exception e) {
Log.e("error==", ""+e.getMessage());
}
return null;
}
}
但是如果想在用webView加载网页时,就能获得网页的Html代码就没那么容易了,SDK并没有提供相关的方法调用。这里用到在webView中进行Java代码和JavaScript代码互掉的方法,用JavaScript获得网页的Html代码很容易吧,然后把提取的html代码传递给Java代码,显示出来就可以了。
首先来看看webView中调用JavaScript以及反过来JavaScript调用Java方法的一般方式,这里还是做了一个小例子,还包括相互传参数的方式。Android代码如下:
public class FourthActivity extends Activity {
WebView mWebView;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWebView = new WebView(this);
setContentView(mWebView);WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JavaScriptInterface(), "aliasInHtml");
mWebView.loadUrl("file:///android_asset/my.html"); //加载assets目录下的本地html文件
}
class JavaScriptInterface{//public void getHTML(String html){
// Log.v("html==", html);
//}
public void startDo(final String parameter){
mHandler.post(new Runnable(){ //启动线程
public void run() {
mWebView.loadUrl("javascript:fillContent('"+parameter+"')");//调用javascript代码,这里是调用了//JavaScript方法,并传递了一个参数
// mWebView.loadUrl("javascript:window.aliasInHtml.getHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
}
});
}
}
}
而放在Android工程的assets目录下的my.html代码如下:
<html>
<script language="javascript">
function fillContent(p){
document.getElementById("content").innerHTML = 'hello:' + p;
}
</script>
<body>
<a onClick="window.aliasInHtml.startDo('dlut');">call method defined in java code</a><!-- 调用Java类的方法 -->
<p id="content"></p>
<p>Tomorrow is another day!!</p>
</body>
</html>
好了,在上面的基础上,如何获得html的代码呢,首先,在JavaScriptInterface类中添加一个方法,供JavaScript调用,从而显示Html内容(即上面代码注释掉的内容):
public void getHTML(String html){
Log.v("html==", html);
}
而首先在 JavaScript中获得Html中代码,然后调用上面的getHtml方法显示出来,写法为:
mWebView.loadUrl("javascript:window.aliasInHtml.getHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
当然,触发获得Html的事件完全可以通过其他方式,这里就是点击网页上的连接,比如可以在那个Activity里添加一个Button,点击Button获得网页的内容。