Appcelerator Android HTTP中的内存泄漏?
我正在使用Appcelerator运行在Android上的内存泄漏。我正在重复进行HTTP GET调用,直到加载所有数据。这个调用大约发生了50次,总共大约40 MB的JSON。如果执行此操作,我看到内存使用率急剧上升。如果我执行这些GET堆大小(由Android设备监视器报告,根据官方Appcelerator文档检查内存的首选方法)将达到〜240 MB ,并且只要应用程序运行,它就会停留在那里。如果我不执行这些GET,它只使用大约50 MB。我不认为这是一个错误的堆阅读,因为如果我再次执行GET(从第1页)我用尽内存。Appcelerator Android HTTP中的内存泄漏?
我已经查看了代码,找不到任何明显的泄漏,例如将所有结果存储在全局变量或其他东西中。 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版本上。
尝试使用HttpClient的的文件属性:http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Network.HTTPClient-property-file
否则文件将被加载到内存中。
6.1.0中会出现内存泄漏修复:https://github.com/appcelerator/titanium_mobile/pull/8818可能会解决某些问题。
我试过使用HTTPClient。它效率更高,但如果我链接了足够的呼叫,它最终仍会耗尽内存。 –
你对响应数据做什么?因为如果你将它分配给一个变量并在某个地方使用它,它当然会留在内存中。也许你应该写回应文件 –
你是否尝试在Android Monitor中运行GC来释放内存并保留它?也许在测试用例中没有必要释放内存? – miga