Appcelerator Android HTTP中的内存泄漏?

时间:2017-02-23 18:54:18

标签: appcelerator appcelerator-titanium appcelerator-mobile

我正在使用Appcelerator遇到Android上的内存泄漏。我重复进行HTTP GET调用,直到加载所有数据。此调用大约发生50次,总共大约40 MB的JSON。如果执行此操作,我会看到内存使用量大幅增加。如果我执行这些GET,那么堆大小(由Android设备监视器报告,根据官方Appcelerator文档检查内存的首选方法)最多可达~240 MB 并且只要应用程序运行就会保持在那里。如果我不执行这些GET,它只使用大约50 MB。我也不认为这是一个错误的堆读取,因为如果我再次执行GET(从第1页开始),我的内存不足。

我查看了代码并找不到任何明显的泄漏,例如将所有结果存储在全局变量或其他内容中。 HTTP响应是否在某处缓存?

这是我的代码,供参考。 syncThings(1, 20)(已清理的名称:))在启动期间被调用。它又调用辅助函数syncDocuments()。这是两个功能。不要担心launchMainWindow(),除非你认为它可能是相关的,但假设它没有清理。

function syncThings(page, itemsPerPage) {
    var url = "the_url";

    console.log("Getting page " + page);
    syncDocuments(url,
        function(response) {
            if (response.totalDocumentsInQuery == itemsPerPage) {
                // More pages to get
                setTimeout(function() {
                        syncThings(page + 1, itemsPerPage);
                    }, 1);
            } else {
                // This was the last page
                launchMainWindow();
            }
        },
        function(e) {
            Ti.API.error('Default error callback called for syncThings;', e);
            dispatcher.trigger('app:update:stop');
        });
}


function syncDocuments(url, successCallback, errorCallback) {
    new HTTPRequest({
        url: url,
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        timeout: 30000,
        success: function (response) {
            Ti.API.info('Success callback called for ' + url);
            successCallback(response);
        },
        error: function (error) {
            errorCallback(error);
        }
    }).send();
}

有什么想法吗?我在这里做错了吗?

编辑:我正在使用Titanium SDK 6.0.1.GA.这种情况发生在所有Android版本上。

1 个答案:

答案 0 :(得分:0)

尝试使用HTTPClient的文件属性:http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Network.HTTPClient-property-file

否则文件将被加载到内存中。

6.1.0中会有一个内存泄漏修复程序:https://github.com/appcelerator/titanium_mobile/pull/8818也可能会修复一些内容。