0

我正在使用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版本上。

+0

我試過使用HTTPClient。它效率更高,但如果我鏈接了足夠的呼叫,它最終仍會耗盡內存。 –

+2

你對響應數據做什麼?因爲如果你將它分配給一個變量並在某個地方使用它,它當然會留在內存中。也許你應該寫回應文件 –

+0

你是否嘗試在Android Monitor中運行GC來釋放內存並保留它?也許在測試用例中沒有必要釋放內存? – miga

回答