Я задавал этот вопрос также на форуме appcelerator, но, как я обнаружил, я часто получаю лучшие ответы от вас, милые люди здесь, на stackoverflow, я также спрашиваю его здесь, только если кто-то может распространить немного света.
Я создал очередь загрузки URL-адресов и использую его для загрузки файлов с httpclient. Каждый файл в downloadQueue отправляется httpclient по одному, а следующая загрузка начинается только после завершения предыдущей.
Когда я начинаю загрузку, кажется, что она работает правильно, и ей удается загрузить несколько файлов, прежде чем она просто зависает, и я получаю сообщение об ошибке «недостаточно памяти» в журнале ошибок DDMS.
Я попытался реализовать предложения, найденные в других сообщениях, пример которых:
[http://developer.appcelerator.com/question/28911/httpclient-leaks-easily-or-can-we-have-a-close-method#answer-104241][1]
[http://developer.appcelerator.com/question/35041/large-file-download-on-mobile][2]
[http://developer.appcelerator.com/question/120129/httpclient-and-setfile][3]
[http://developer.appcelerator.com/question/95521/httpclient---save-response-directly-to-file][4]
Я попробовал все следующее:
- перемещение больших загрузок файлов непосредственно из nativepath, а не просто сохранение в файл, чтобы гарантировать, что tmp-файлы не будут храниться дольше, чем это необходимо.
используя недокументированный метод setFile httpclient. (Это остановило мой код без каких-либо сообщений об ошибках, и, поскольку он недокументирован, я понятия не имею, был ли он когда-либо реализован на Android)
-использование settimeout в httplient.onload после загрузки файла, чтобы сделать паузу на 1 секунду перед запросом следующего файла (я понятия не имею, как это могло бы помочь, но я теперь держусь за соломинку)
Ниже приведены соответствующие части моего кода (который завершен, за исключением функций GetFileUrls, которые я для простоты исключил, поскольку вся эта функция возвращает массив URL-адресов).
Может ли кто-нибудь обнаружить что-то, что может вызвать проблемы с моей памятью. Есть ли у кого-нибудь идеи, как я пробовал все, что я могу придумать? (HELP!)
var count = 0;
var downloadQueue = [];
var rootDir = Ti.Filesystem.getExternalStorageDirectory();
downloadQueue = GetFileUrls(); /* this function is not included in order to keep my post as short as possible, bu it returns an array of urls */
DownloadFile(downloadQueue[count]);
var downloader = Ti.Network.createHTTPClient({timeout:10000});
downloader.onerror = function(){
Ti.API.info(this.responseData);
}
downloader.onload = function(){
SaveFile(this.folderName, this.fileName, this.responseData);
count += 1;
setTimeout( function(){ DownloadFile(); }, 1000);
}
function DownloadFile(){
if (count < downloadQueue.length){
var fileUrl = downloadQueue[count];
var fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1);
downloader.fileName = fileName;
downloader.folderName = rootDir;
downloader.open('GET', fileUrl);
downloader.send();
}
}
function SaveFile(foldername, filename, response){
if (response.type == 1){
var f = Ti.Filesystem.getFile(response.nativePath);
var dest = Ti.Filesystem.getFile(foldername, filename);
if (dest.exists()){
dest.deleteFile();
}
f.move(dest.nativePath);
}else{
var dest = Ti.Filesystem.getFile(foldername, filename);
dest.write(response);
}
}