Как узнать, когда завершится appcache? - PullRequest
0 голосов
/ 06 марта 2012

Есть ли способ узнать, когда веб-просмотр завершил кэширование файлов, запрашиваемых манифестом HTML5?

Вот что я делаю, но я мог бы получить неполное отображение в автономном режиме (пропуская некоторые изображения)

//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 Ответ

0 голосов
/ 21 августа 2012

Оригинальный постер поместил это как обновление вопроса, но это действительно ответ, поэтому я перевожу его сюда:

Все остальное содержание от оригинального постера :

Благодаря предложению Роберта, вот что я делаю сейчас:

На стороне JS я слушаю кешированное событие. Когда он запускается, я вызываю метод на своем интерфейсе JS, который создает файл «cachepresent.dummy» в папке кэша Android. Таким образом, я мог узнать, заполнен ли кеш или нет на стороне Android, проверив, существует ли этот файл. Используя тот же механизм, я очищаю всю папку кэша Android, когда запускается событие 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...