2012-03-06 104 views
0

有沒有辦法知道webview何時完成緩存HTML5清單請求的文件?如何知道appcache何時完成?

下面是我在做什麼,但我可以不完全顯示結束時,離線(丟失了一些圖片)

//v is my WebView instance 
String cachePath = "/data/data/"+getPackageName()+"/cache"; 
v.getSettings().setAppCachePath(cachePath); 
v.getSettings().setAppCacheMaxSize(1024*1024*4); // 4Mo default cache size 
v.getSettings().setAllowFileAccess(true); 
v.getSettings().setAppCacheEnabled(true); 
v.getSettings().setDomStorageEnabled(true); 

ConnectivityManager cm = (ConnectivityManager)this.getSystemService(Activity.CONNECTIVITY_SERVICE); 
NetworkInfo netInfos = cm.getActiveNetworkInfo(); 
if(null != netInfos && netInfos.isConnected()) { 
    v.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
} 
else { 
    File f = new File(cachePath); 
    if(f.exists()){ 
     v.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY); 
    } 
    else{ 
     url = fallbackUrl; 
    } 
} 

我想通知當緩存完成甚至更好的知道緩存目錄是否「損壞」。

+1

你有權訪問['cached'和'updateready'事件](http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#event-appcache-緩存)? – robertc 2012-03-06 14:35:36

+0

你的意思是在Js方面?如果是的話,是的。我會檢查的。謝謝 – noobypapa 2012-03-06 19:12:21

回答

0

樓主把這個作爲一個更新的問題,但它是一個真正的答案,所以我在這裏移動它:

從原來的海報其餘所有內容:

感謝robertc建議,這裏是我現在正在做的:

在JS方面,我正在偵聽緩存的事件。 當它被觸發時,我在我的JS接口上調用一個方法,在android緩存文件夾中創建一個「cachepresent.dummy」文件。通過這種方式,我可以通過測試該文件是否存在來知道緩存是否完整。 使用相同的機制,當updateready事件觸發時,我正在清除整個android緩存文件夾。

下面是Java代碼:

private class JsInterface { 

    public JsInterface() {} 

    @SuppressWarnings("unused") 
    public void cached() { 
     File f = new File("/data/data/"+getPackageName()+"/cache/cachepresent.dummy"); 
     FileWriter w; 
     try { 
      w = new FileWriter(f); 
      w.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    private void DeleteRecursive(File f) { 
     if (f.isDirectory()) { 
      for (File child : f.listFiles()) { 
       DeleteRecursive(child); 
      } 
     } 
     f.delete(); 
    } 

    @SuppressWarnings("unused") 
    public void clearCache(){ 
     File f = new File("/data/data/"+getPackageName()+"/cache"); 
     DeleteRecursive(f); 
    } 

} 
... 
//add the javascript interface to the webview 
jsInterface = new JsInterface(); 
v.addJavascriptInterface(jsInterface, "JsBridge"); 

//Check if the cache is complete 
File cachePresentFile = new File("/data/data/"+getPackageName()+"/cache/cachepresent.dummy"); 
boolean cachePresent = cachePresentFile.exists(); 

而且JS代碼:

function cacheReload() { 
     var cache = window.applicationCache; 
     try{ 
      cache.update(); 
     } 
     catch(e){ 
      //android 2.2 does not seem to support this :'(
      console.log("JS Exception: " + e); 
     } 
     cache.addEventListener("updateready", 
      function() { 
       JsBridge.clearCache(); 
       cache.swapCache(); 
       window.location.reload(); 
      } 
     ); 

     cache.addEventListener("cached", 
      function() { 
       JsBridge.cached(); 
      } 
     ); 
    } 

BTW我敢肯定有一個更聰明的方式通過使用HTML5 localStorage的東西來實現這一目標。

+0

謝謝@Troot,我會盡量記住下次創建一個新帖:) – noobypapa 2012-08-21 08:07:25