我正在使用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版本上。
答案 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也可能会修复一些内容。