2013-10-14 76 views
1

我有一個應用程序使用Google Map Javascript API v3和一個UIWebView在屏幕上顯示地圖。在此地圖上,我可以使用該應用來收集多個GPS數據點以表示一條線。爲什麼不RemoveAllCacheResponses完全清除磁盤緩存?

enter image description here

收集一四六〇年至1480年後點的應用程序意外退出(捏縮放地圖上,使達到1400 +的門檻之前,該應用程序退出)。這似乎是一個記憶問題(我的應用程序是餅圖的藍色楔形)。

enter image description here

地圖畫面確實接收了在此屏幕中被覆蓋的方法DidReceiveMemoryWarning處理多個存儲器的警告。有一些先前的代碼稱爲NSUrlCache.SharedCache.RemoveAllCachedResponses。

public override void DidReceiveMemoryWarning() 
{ 

    // BEFORE 
    uint diskUsage = NSUrlCache.SharedCache.CurrentDiskUsage; 
    uint memUsage = NSUrlCache.SharedCache.CurrentMemoryUsage; 
    int points = _currentEntityManager.GeometryPointCount; 
    Console.WriteLine(string.Format("BEFORE - diskUsage = {0}, memUsage = {1}, points = {2}", diskUsage, memUsage, points)); 

    NSUrlCache.SharedCache.RemoveAllCachedResponses(); 

    // AFTER 
    diskUsage = NSUrlCache.SharedCache.CurrentDiskUsage; 
    memUsage = NSUrlCache.SharedCache.CurrentMemoryUsage; 
    points = _currentEntityManager.GeometryPointCount; 
    Console.WriteLine(string.Format("AFTER - diskUsage = {0}, memUsage = {1}, points = {2}", diskUsage, memUsage, points)); 

    base.DidReceiveMemoryWarning();  
} 

我添加了BEFORE和AFTER部分,所以我可以在調用RemoveAllCachedResponses之前和之後跟蹤緩存內容。

共享緩存是在應用程序啓動時配置的(在我處理此問題之前,它根本沒有配置)。

uint cacheSizeMemory = 1024 * 1024 * 4; 
uint cacheSizeDisk = 1024 * 1024 * 32; 
NSUrlCache sharedCache = new NSUrlCache(cacheSizeMemory, cacheSizeDisk, ""); 
NSUrlCache.SharedCache = sharedCache; 

當我們在這個屏幕上採集點的數據,我們收到內存不足警告,RemoveAllCachedResponses被稱爲和前/統計信息打印到控制檯後。以下是我們收到的第一條低記憶警告的數字。

BEFORE - diskUsage = 2258864, memUsage = 605032, points = 1174 
AFTER - diskUsage = 1531904, memUsage = 0, points = 1174 

這是我所期望的發生 - 清空緩存減少了磁盤和內存使用(雖然我預計磁盤使用數量也去到零)。

對RemoveAllCachedResponses的所有後續調用都會顯示這些統計信息(此前/後緊接在應用程序崩潰之前)。

BEFORE - diskUsage = 1531904, memUsage = 0, points = 1471 
AFTER - diskUsage = 1531904, memUsage = 0, points = 1471 

這使我相信兩件事情之一 - 1 RemoveAllCachedResponses不工作(不太可能)或2有什麼東西在無法刪除的磁盤緩存,因爲它是目前使用的,有點像當前一組地圖瓦片。

關於#2,我想相信這一點,計算第一次調用時磁盤使用率的減少表示由於縮放而不再使用的一組磁貼,但沒有縮放或平移完全是在這張地圖上完成的,即只有一組初始磁貼應該被下載和緩存。

此外,我們正在將Google Map Javascript API文件加載爲本地HTML,因此可能是此文件是剩餘駐留在緩存中的內容。但是該文件只有18,192字節,它不會在磁盤高速緩存中剩餘1,531,904字節。

我還應該提到,這個應用程序的Android版本(用Xamarin.Android編寫)在其地圖屏幕上沒有這樣的內存問題 - 有可能收集5500+點沒有事件)。

那麼爲什麼磁盤緩存清零時不會變爲零?

在此先感謝。

回答