2012-03-06 15 views
0

Webビューが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

+0

あなたはJs側を意味しますか?そうなら、はい。私はそれを確認します。お返事ありがとうございます – noobypapa

答えて

0

オリジナルポスターは、質問への更新としてこれを置くが、それは本当に答えですので、私はそれをここに移動しています:

オリジナルポスターから残りのすべてのコンテンツ:

をrobertcのおかげで私が今やっていることはここにあります:

私はキャッシュされたイベントを聞いています。 解雇されると、アンドロイドキャッシュフォルダにファイル "cachepresent.dummy"を作成するJSインターフェースのメソッドを呼び出します。こうすれば、このファイルが存在するかどうかをテストすることで、キャッシュが完全かどうかをアンドロイド側で知ることができます。 同じメカニズムを使用して、私はupdatereadyイベントが発生したときにアンドロイドキャッシュフォルダ全体をクリアします。ここで

は、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(); 
      } 
     ); 
    } 

はところで私は、HTML5のlocalStorageのものを使用することによって、これを達成するために、よりスマートな方法があるかなり確信しています。

+0

私は次の時間に新しい投稿を作成するために覚えようとします:) – noobypapa

関連する問題