Почему у меня заканчивается память при загрузке нескольких файлов в appcelerator mobile на Android - PullRequest
0 голосов
/ 18 декабря 2011

Я задавал этот вопрос также на форуме 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);
    }
}

1 Ответ

0 голосов
/ 19 декабря 2011

попробуйте использовать события вместо вложенной рекурсии, которую вы используете. Android, похоже, не слишком нравится

...