174
技術社區[雲棲]
Android的webView中獲得Html代碼
需求是,將網頁顯示在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("https://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 ></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獲得網頁的內容。
最後更新:2017-04-02 16:47:52