2011-12-11 46 views
9

我試圖讓網絡的HTML5離線緩存版本在webview內部關閉時顯示。在android中顯示webview的緩存版本

我已經覆蓋onReceivedError ok,並且當網絡關閉時調用此方法。 問題是它顯示通用的「網頁不可用」消息。

如何獲取它以顯示HTML5緩存版本的頁面? Web應用程序的離線存儲器可以正常工作,因爲它可以在桌面版Firefox和Chrome中正常工作。

我知道我可以在onReceivedError手動調用loadData進入視圖,但我不知道從哪裏可以獲取HTML5緩存值。

注:如果我在loadDataview.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8");,然後單擊後退(設置一些虛擬的數據通過檢測回事件,並呼籲webview.goBack();那麼頁面的緩存版本的顯示OK

下面是一些代碼行。我加入到設置web視圖:

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
webview.getSettings().setAppCacheMaxSize(1024*1024*8);       
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache"); 
webview.getSettings().setAllowFileAccess(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setJavaScriptEnabled(true); 

回答

6

嘗試找出使用

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 

Detect whether there is an Internet connection available on Android)網絡狀態

這也需要

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

在AndroidManifest.xml中

現在可以將緩存行爲設置要麼LOAD_CACHE_ONLY或LOAD_NO_CACHE,這取決於網絡連接是否可用,與

webview.getSettings().setCacheMode(...) 
+0

這可能是「最乾淨」的解決方案,所以生病給你的賞金點:) – Marty

2

我認爲一個好的解決辦法是使用LOAD_NORMAL和onReceivedError導航回我認爲這將根據文檔(不知道如果我沒有記錯)加載緩存,但會小心不要陷入無限循環


很是怪異。根據該documentation

覆蓋使用高速緩存的方式。使用緩存的方式基於導航選項上的 。對於正常的頁面加載,檢查緩存 ,並根據需要重新驗證內容。在返回時,內容 未被重新驗證,而是僅從緩存中提取內容。 此函數允許客戶端覆蓋此行爲。

不過你想要的行爲似乎並沒有成爲其中之一:

  1. LOAD_CACHE_ELSE_NETWORK

    使用緩存,如果內容是存在的,即使過期(例如,歷史NAV)如果它不在緩存中,從網絡加載。

  2. LOAD_CACHE_ONLY

    不要使用網絡負載僅從緩存。

  3. LOAD_DEFAULT

    默認的緩存使用模式

  4. LOAD_NORMAL

    正常高速緩存使用模式

  5. LOAD_NO_CACHE

    不要使用緩存,負載從網絡


我不知道你是否能子類的WebView以獲得所需的流量。


+0

對不起忘了提,我編輯我的問題.. – Marty

+0

@Marty做你試圖改變LOAD_DEFAULT到LOAD_NORMAL –

+0

仍然只是具有通用的「找不到網頁」的消息時,網絡連接發生故障時,我使用LOAD_NORMAL – Marty

1

這豈不是工作,如果你只是讓瀏覽器處理呢?指定清單在這樣的HTML標籤:

<html manifest="mycache.appcache"> 

...當沒有可用的連接,瀏覽器會自動使用它,你不應該需要在所有更改任何設置。

0

您應該首先在您的AndroidManifest中設置權限。XML

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 

然後檢查互聯網網絡是打開或關閉:

private boolean isNetworkAvailable() { 
      ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
      return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
     } 

最後你網頁視圖對象添加下面的代碼,如果你的互聯網

webView = (WebView) findViewById(R.id.WebEngine); 
     webView.getSettings().setAppCacheMaxSize(5 * 1024 * 1024); // 5MB 
     webView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath()); 
     webView.getSettings().setAllowFileAccess(true); 
     webView.getSettings().setAppCacheEnabled(true); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
     if (!isNetworkAvailable()) { // loading offline 
      webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
     } 
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1"); 

完蛋了在您的網頁開啓正常版本在並保存在緩存中,如果您的網絡關閉那麼它會自動在緩存版本中打開