Android ImgCache-如何在嵌套for循环内正确等待异步完成
我正在为Android开发Cordova应用程序。我必须解析由帖子组成的JSON。每篇文章都有文本(标题、描述、类别等)和图像(图像数组-可以是一个或多个)。我的目标是存储JSON数据以供脱机使用(保存到SQLlite数据库)。现在,下面的示例代码起作用,但顺序不是我所期望的:Android ImgCache-如何在嵌套for循环内正确等待异步完成,android,angularjs,cordova,Android,Angularjs,Cordova,我正在为Android开发Cordova应用程序。我必须解析由帖子组成的JSON。每篇文章都有文本(标题、描述、类别等)和图像(图像数组-可以是一个或多个)。我的目标是存储JSON数据以供脱机使用(保存到SQLlite数据库)。现在,下面的示例代码起作用,但顺序不是我所期望的: 请求JSON(ok) 等待所有承诺(ok) 解析JSON(在下载所有图像之前完成) 将信息存储到数据库中,但图像仍在下载(在后台线程中-对UI无害) 我想要的是在下载完所有图像后将其存储到数据库中。我已经尝试过很多方法,
checkCache
完成。你怎么认为?我如何克服这个问题?如果你需要任何进一步的解释,就问我
我的设置是:
Cordova 4.0.0
,Angular 1.3.1
和ImgCache 1.0
我的做法是:
第一。请求JSON:
promise1 = $http({method: 'GET', url: baseURL + options1};
promise2 = $http({method: 'GET', url: baseURL + options2};
//...
第二。等待所有的承诺
return $q.all([promise1,promise2,...]).then(function(data){
var promise1size = data[0].data.posts_number;//posts.length;
parseJSON(data[0],promise1size,'category1');
var promise2size = data[1].data.posts_number;//posts.length;
parseJSON(data[1],promise1size,'category2');
//similar for the rest promises
});
三,。解析JSON
function parseJSON(respdata,size,category){
console.log("Parsing "+size+" "+category);
for(i=0;i<size;i++){
var item = {};
item ["id"] = respdata.data.object[i].id;
item ["title"] = respdata.data.object[i].title;
item ["description"] = respdata.data.object[i].description;
var jsarray = respdata.data.object[i].categories;
item ["category"] = jsarray[0].title;
item ["catid"] = jsarray[0].id;
//Other JSON keys here similar as above
//Here it starts...
var jsattachement = respdata.data.object[i].attachments;
var atsize = jsattachement.length;
if(atsize>0){
var images=[];
for(j=0;j<atsize;j++){
(function(j){checkCache(jsattachement[j].url)}(j));//here is the problem
multimedia.push({title:item["title"], src:ImgCache.returnCachedURL(jsattachement[j].url), w:400,h:300});
images.push({title:item["title"],src:ImgCache.returnCachedURL(jsattachement[j].url),w:400,h:300});
}
item ["attachement"] = images;
}else
item ["attachement"] = [];
if(category=='category1')
response.category1.push(item);
else if(category=='category2')
response.category2.push(item);
//else if...
//else if...
}
}
};
第四。存储到数据库
在这里,我将解析后的信息保存到数据库中。在步骤3中,我对图像使用了returnCachedURL
功能(这不是异步的),这样即使图像可能尚未下载(但最终会下载),也可以准备好图像的本地路径。我这样做:
与您类似,但使用更新sql存储每个下载图像的图像。然后,我发现我的一些用户想和我一起玩,他们在图像下载中间断开了互联网连接!所以我在sql中有不完整的记录!天哪
然后我改为:我创建一个临时全局变量,例如tempvar={},然后:tempvar.data1='hello',tempvar.preparedatacompleted=true,tempvar.ImagesToBeDownload=5,tempvar.imagesdownload=0,tempvar.imagearray=
然后,每次下载图像时,在数字上加1,如果该数字=总数,则调用将此tempvar中的所有数据和图像保存到sql的函数
function checkCache (imgsrc){
ImgCache.isCached(imgsrc, function(src, success) {
if(!success){
ImgCache.cacheFile(src, function(){});
}
});
};