Android 在WebView中捕获内存不足错误?

Android 在WebView中捕获内存不足错误?,android,webview,flash,segmentation-fault,Android,Webview,Flash,Segmentation Fault,当将某些.swf文件加载到网络视图中时,flash文件开始显示后的一瞬间,我的应用程序关闭,出现信号11故障。没有抛出我可以看到的异常 将相同的.swf文件加载到stock Android浏览器时,会显示一个错误图标,而不是关闭。触摸它会打开一个弹出窗口:“Adobe Flash;内存不足” 我的问题是:有没有办法在SIGSEGV发生之前捕获内存不足错误——防止任务终止——就像股票浏览器那样?任何帮助都将不胜感激 注意:我正在Android 2.2下使用HTC版本的Flash插件进行测试,但在

当将某些.swf文件加载到网络视图中时,flash文件开始显示后的一瞬间,我的应用程序关闭,出现信号11故障。没有抛出我可以看到的异常

将相同的.swf文件加载到stock Android浏览器时,会显示一个错误图标,而不是关闭。触摸它会打开一个弹出窗口:“Adobe Flash;内存不足”

我的问题是:有没有办法在SIGSEGV发生之前捕获内存不足错误——防止任务终止——就像股票浏览器那样?任何帮助都将不胜感激


注意:我正在Android 2.2下使用HTC版本的Flash插件进行测试,但在其他非HTC设备上似乎也出现了类似的问题。我正在使用以下命令将swf文件直接加载到WebView中:

webView.loadUrl("http://whatever.com/bla.swf");

(启用插件和JavaScript)。它在大多数情况下都能很好地工作——只有少数文件会导致问题。我尝试过各种减少内存的建议(例如清除WebView缓存),但都没有成功。

我认为即使在onPause()中,您也需要处理kill

在下面的链接上,您将看到一个包含活动中所有可重写方法的表。它有一个专栏叫做killable。这表明可以终止此方法。由于onDestroy()是一个可杀死的方法,因此它可能不会被调用。但是onPause()是不可终止的,所以您可以在这里处理保存状态或其他任何内容的逻辑。

另一种解决方案是使用后台任务或服务来监控设备上的内存使用情况,如果系统告诉您内存不足,请停止闪存活动

要知道内存是否不足,可以使用以下代码:

ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); 
activityManager.getMemoryInfo(memoryInfo);

boolean onLowMemory = memoryInfo.lowMemory;

或者,如果内存太低(接近memoryInfo.threshold),您可以使用memoryInfo.Availem检查可用内存,在异常发生之前终止活动。

谢谢。但是,我只是检查了一下,在本例中,六次尝试中有五次没有调用OnPause()。另外,我想做的是完全防止终止,就像股票网络浏览器一样。谢谢!假设没有更简单的解决方案(从缺乏回应的角度来看,这似乎是很有可能的),这听起来似乎是可行的!正如我所知,我想使用单独的任务或服务而不是线程来完成此任务是有原因的?建议的方法是使用异步任务,如果使用线程并调用onDestroy,则会丢失对活动中线程的引用,尽管可以使用onRetainonConfiguration Instance()保存它并使用getLastNonConfigurationInstance()检索它。好的,再次感谢!无论如何,这更容易。你知道两次检查之间可以使用什么样的间隔吗?我猜他们需要非常频繁,以确保他们发现问题。我预计内存会随着时间或多或少地线性增加,因此另一种可能性是通过在短时间间隔内监控任务来计算启动任务时内存使用量增加的程度,然后预测什么时候可用内存会太少。您的解决方案也应该有效,而且可能更容易,我想您需要进行一点实验来调整间隔,但我会经常这样做。好的,再次感谢。不幸的是,我不确定Flash是否总是以恒定的速率将内容加载到内存中。例如,在一个文件中,故障直到视频播放到一半才会发生,因此根据所使用的文件,故障可能会有很大的不同。此处添加了一个相关问题:。虽然它是关于同一个基本问题,但这是一个单独的问题,因为这个问题主要基于一个错误的前提(多亏Adobe的误导性错误消息)。