我有一个应用程序,它使用Google Map Javascript API v3和UIWebView在屏幕上显示地图。在此地图上,我可以使用该应用收集多个GPS数据点来表示一条线。
收集1460-1480分后,应用程序意外退出(地图上的缩放缩放使应用程序在达到1400+阈值之前退出)。它似乎是一个内存问题(我的应用程序是饼图的蓝色楔形)。
地图屏幕确实会收到多个内存警告,这些警告在此屏幕中以重写的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+点。
那么为什么磁盘缓存在清除后不会变为零?
提前致谢。
答案 0 :(得分:0)
我也对此感到困惑。你可以看看我问的问题。 removeAllCachedResponses can not clear sharedURLCache? 同志说"它在缓存中有一些额外的开销,而且它与真实的网络数据无关。"