2013-02-03 89 views
58

我實際上是Java編程的新手,但我一直在解決我的問題的幾個解決方案,但沒有找到一個適合我的案例,我似乎無法正確地取下代碼。WebView在線時加載網站,在離線時加載本地文件

我希望有一個WebView,當手機處於聯機狀態時打開在線頁面(例如Google),並在手機處於脫機狀態時打開本地HTML頁面。

同時,雖然我希望手機在聯機時覆蓋本地頁面,以便離線本地頁面始終更新到最後一次手機連接到互聯網。

任何想法如何做到這一點? 一些簡單的指向正確的方向可能會有所幫助。

非常感謝。

回答

103

這聽起來像一個簡單的webview緩存機制給我。

以下應該做你在找什麼:

WebView webView = new WebView(context); 
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); // load online by default 

if (!isNetworkAvailable()) { // loading offline 
    webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
} 

webView.loadUrl("http://www.google.com"); 

的方法isNetworkAvailable()檢查活動的網絡連接:

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

最後,不要忘了添加以下三種權限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"/> 
+1

這是真的完整..作品像一個魅力!非常感謝你給我看緩存模式 – mstation

+0

不用擔心,很高興幫助:) – jenzz

+0

@jenzz:我的解決方案有兩個問題。首先,就我而言,緩存目錄(外部SD卡)中出現的所有內容都是名爲ApplicationCache.db的* empty *文件。不應該更大?也許緩存存儲在其他地方?其次,'.setAppCacheMaxSize()'東西在API18中已棄用,不確定如何添加更多的chache然後... –

16

h有時候WebView不能被本地緩存。如果頁眉包含以下字段,則WebView將無法緩存該頁面中的內容。緩存控制:無存儲,無緩存Pragma:無緩存

在這種情況下,您將不得不修改服務器上的頁面屬性來解決緩存問題。

相關問題