2012-03-06 4 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

당신은 ['캐시 된'및'updateready' 이벤트들]에 접근 할 수 있습니까 (http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#event-appcache- 캐시 된)? – robertc

+0

Js 측에서 의미가 있습니까? 그렇다면 예. 나는 그것을 검사 할 것이다. 감사합니다 – noobypapa

답변

0

는 원래 포스터는 질문에 대한 업데이트로 넣어,하지만 정말 답, 그래서 여기에 이동 해요 :

원래 포스터에서 남아있는 모든 내용 : robertc에

감사합니다 제안, 여기에 내가 지금하고있는 일이있다 :

JS 측에서는 캐시 된 이벤트를 듣고있다. 해고되면 안드로이드 캐시 폴더에 "cachepresent.dummy"파일을 만드는 JS 인터페이스의 메소드를 호출합니다. 이 파일이 존재하는지 테스트하여 안드로이드 측에서 캐시가 완전한지 아닌지를 알 수 있습니다. 동일한 메커니즘을 사용하여 updateready 이벤트가 발생하면 전체 안드로이드 캐시 폴더를 삭제합니다.

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 로컬 저장 재료를 사용하여이를 달성 할 수있는 스마트 한 방법이 확신 여기

는 자바 코드입니다.

+0

감사합니다 @ Troot, 다음에 새 게시물을 만드는 것을 기억하려고합니다 :) – noobypapa

관련 문제