我有一个使用 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+ 点)。
那么为什么磁盘缓存在清除后不会归零呢?
提前致谢。