2013-10-14 53 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+点没有事件)。

那么为什么磁盘缓存清零时不会变为零?

在此先感谢。

回答