簡體   English   中英

如何知道何時執行appcache?

[英]Howto know when appcache is done?

有沒有辦法知道webview何時完成了緩存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;
    }
}

我想在緩存完成時得到通知,甚至更好地知道緩存目錄是否“損壞”。

原始海報將其作為對問題的更新,但這實際上是答案,因此,我將其移至此處:

原始海報的所有剩余內容

感謝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();
            }
        );
    }

順便說一句,我很確定可以通過使用HTML5 LocalStorage來實現這一目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM