[英]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.