2012-10-28 60 views
0

我正在構建一個原生應用,其中(至少)一部分是一個Web應用,僞裝成本地應用。 Facebook向我們展示了使用良好緩存的重要性,我在緩存網頁,因此當您第二次加載它時,它就像是應用程序的本地部分。但是,按照我設置的方式,緩存的內容是永久的。因此,如果我在服務器上更改某些內容,舊的緩存內容仍會顯示。如何刷新網頁視圖的緩存?

以下是我希望以優先順序實現的結果,1是最優選的。

  1. 無論緩存的內容都先顯示。在後臺,頁面檢查新版本,但只在內容不同時重新加載。
  2. 或先緩存的內容顯示。在後臺頁面刷新和重新加載。
  3. 或緩存的內容在X時間(一週?)後被抹掉,強制頁面重新加載。

最後一個選項是最不可取的,因爲每次頁面重新加載時,感覺都很慢,很可怕。第二個選擇是我的本地活動的行爲方式(首先顯示緩存,在後臺刷新,但如果用戶在此期間向下滾動,則會跳轉到列表頂部)。首先是絕對完美的!

這是我目前使用的代碼。

WebView wv = (WebView) v.findViewById(ref_id); 
wv.getSettings().setJavaScriptEnabled(true); 
wv.getSettings().setDatabaseEnabled(true); 
String appDBPath = v.getContext().getApplicationContext().getDatabasePath("AppConstructor").getAbsolutePath(); 

    wv.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onReachedMaxAppCacheSize(long spaceNeeded, 
       long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
      quotaUpdater.updateQuota(spaceNeeded * 2); 
     } 

     @Override 
     public void onExceededDatabaseQuota(String url, 
       String databaseIdentifier, long currentQuota, 
       long estimatedSize, long totalUsedQuota, 
       WebStorage.QuotaUpdater quotaUpdater) { 
      quotaUpdater.updateQuota(estimatedSize * 2); 
     } 
    }); 

wv.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
wv.getSettings().setDomStorageEnabled(true); 
wv.getSettings().setAppCacheMaxSize(1024 * 1024 * 8); 
String appCachePath = v.getContext().getApplicationContext().getCacheDir().getAbsolutePath(); 
wv.getSettings().setAppCachePath(appCachePath); 
wv.getSettings().setAllowFileAccess(true); 
wv.getSettings().setAppCacheEnabled(true); 
wv.loadUrl(ref_arg1); 
Core x = new Core(); 
wv.addJavascriptInterface(x.new JavaScriptInterface(v.getContext()),"Android"); 

任何幫助將不勝感激!

回答

4

OK,尋找年齡,甚至讓StackOverflow上的風滾草的成就後,這裏就是我設法讓情況1.

WebView加載它的緩存,它開始一個新的ASyncTask。這個ASyncTask將一些東西附加到URL上,這是我自己定製的最後更新變量。當然,你可以用HTTP Header Last-Update替換這個,但這對我沒有用。如果結果變量不同於緩存變量(我存儲在SharedPreferences中),ASyncTask使用以下代碼強制刷新WebView的緩存。

_wv.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
_wv.reload(); 
+1

your'e genius !!。 – xamDev