Webview的使用和注意事項


1.webView是一個展示web網頁的控件,繼承 AbsoluteLayout 

2.webview的倆個回調應用層:

1)webViewClient 這個對象的創建

  WebViewClient myWibviewVlient=new WebViewClient(){  

 

  /*當內核開始加載訪問的url時,會通知應用程序,對每個main frame這個函數只會被調用一次,頁面包含iframe 或者framesets 不會另外調用一次onPageStarted,當網頁內內嵌的frame 發生改變時也不會調用onPageStarted。

  */

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {

}

/*
*
  參數說明:
  @param view 接收WebViewClient的那個實例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是這個webview。
  @param url    即將要被加載的url
  @return  true 當前應用程序要自己處理這個url, 返回false則不處理。

*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 消耗掉這個事件。Android中返回True的即到此為止吧,事件就會不會冒泡傳遞了,我們稱之為消耗掉
mWebView.loadUrl(url);
return true;
}

@Override
public void onPageFinished(WebView view, String url) {


}


@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
//handler.cancel(); // Android默認的處理方式
handler.proceed(); // 接受所有網站的證書
// handleMessage(Message msg); // 進行其他處理
}

@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
dismissLoadingProgress();
}

};

2)WebChromeClient

(暫時沒有用過,就不給大家分享了)

 

3.loadData與loadDataWithBaseURL的區別

 

      在寫WebView時,感覺LoadUrl太浪費流量,而且加載起來有點慢,就考慮用其它的方法來實現。在加載頁面時,如果只加載數據,頁面模板提前寫好放到項目中,這樣就可以來更快的加載頁面,用戶體驗會好些。

 

      如果不用loadUrl,省下的就只有LoadData和loadDataWithBaseURL了,下面來說下LoadData和loadDataWithBaseURL 的用法;

 

      loadData:

public void loadData (String data, String mimeType, String encoding)

    data:是要加載的數據類型,但在數據里面不能出現英文字符:'#', '%', '\' , '?' 這四個字符,如果有的話可以用 %23, %25, %27, %3f,這些字符來替換,在平時測試時,你的數據時,你的數據里含有這些字符,但不會出問題,當出問題時,你可以替換下。

       %,會報找不到頁面錯誤,頁面全是亂碼。亂碼樣式見符件。

       #,會讓你的goBack失效,但canGoBAck是可以使用的。於是就會產生返回按鈕生效,但不能返回的情況。

       \ 和? 我在轉換時,會報錯,因為它會把\當作轉義符來使用,如果用兩級轉義,也不生效,我是對它無語了。

我們在使用loadData時,就意味着需要把所有的非法字符全部轉換掉,這樣就會給運行速度帶來很大的影響,因為在使用時,在頁面stytle中會使用很多%號。頁面的數據越多,運行的速度就會越慢。

      data中,有人會遇到中文亂碼問題,解決辦法:參數傳"utf-8",頁面的編碼格式也必須是utf-8,這樣編碼統一就不會亂了。別的編碼我也沒有試過。

 

public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

在使用loadDataWithBaseURL時,需要注意的就是 baseUr:雖然API上寫的是要傳一個Url,但我在用時,發現傳一個Url並不可以,我發現這個就是一個標志位,用來標志當前頁面的Key值的,而historyUrl就是一個value值,在加載時,它會把baseUrl和historyUrl傳到List列表中,當作歷史記錄來使用,當前進和后退時,它會通過baseUrl來尋找historyUrl的路徑來加載historyUrl路徑來加載歷史界面,需要注意的就是history所指向的必須是一個頁面,並且頁面存在於SD卡中或程序中(assets),loadDataWithBaseURL,它本身並不會向歷史記錄中存儲數據,要想實現歷史記錄,需要我們自己來實現,也許是我的技術有限,我有了比較笨的訪求來實現:就是在加載頁面時,我把數據另外的寫到一個html頁面中,並把它保存到SD中,當點擊返回時,它會通過historyUrl指向的路徑來加載頁面,這樣就解決了歷史記錄問題。

 當然baseUrl和historyUrl都可以為空

上面這兩種方法,我建議使用后者,雖然loadData的歷史記錄不需要我們自己來實現,但在使用時,我們必須把所有的%,#,\,?轉換掉,在轉換時,也許會遇到別的困難,我也沒有測完。這就兩個加載上后者比前者快一到兩倍。

 

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM