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

发布于 2024-11-08 19:11:17 字数 685 浏览 0 评论 0原文

将某些 .swf 文件加载到 WebView 中时,在 Flash 文件开始显示后的一瞬间,我的应用程序因 Signal 11 错误而关闭。我看不到任何异常。 此处为 LogCat 转储示例

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

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


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

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

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

When loading certain .swf files into a WebView, a split second after the flash file begins to be displayed, my app closes with a Signal 11 fault. No exception is thrown that I can see. Example LogCat dump here.

When loading the same .swf files into the stock Android browser, instead of closing, an error icon is displayed. Touching it opens a pop-up stating: "Adobe Flash; Insufficient Memory".

My question is: Is there any way to catch the Insufficient Memory error before the SIGSEGV occurs -- preventing the task from being terminated -- as is done by the stock browser? Any help would be greatly appreciated!


Note: I'm testing under Android 2.2 with the HTC version of the Flash plugin, but it appears that the same sort of issues occur on other, non-HTC devices. I'm loading the swf file into the WebView directly, using:

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

(with plugins and JavaScript enabled). It works perfectly in most cases -- only a few files cause problems. I've tried various suggestions for reducing memory (such as clearing the WebView caches) without success.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最舍不得你 2024-11-15 19:11:17

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

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

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

boolean onLowMemory = memoryInfo.lowMemory;

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

An alternative solution could be to use a background task or service to monitor the memory usage on the device, if the system tells you that you're on low memory, kill the flash activity.

To know if you are on low memory you can use this code:

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

boolean onLowMemory = memoryInfo.lowMemory;

Or you can check the available memory using memoryInfo.availMem, if it's too low (close to memoryInfo.threshold) kill your activity before the exception.

谁对谁错谁最难过 2024-11-15 19:11:17

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

在下面的链接上,您将看到活动中可以覆盖的所有方法的表格。它有一个名为“killable”的列。这表明这个方法可以被杀死。由于 onDestroy() 是一个可杀死的方法,因此它有可能不会被调用。但是 onPause() 是不可杀死的,所以你可以在这里处理保存状态或其他任何内容的逻辑。
活动

I think you need to handle the kill even in onPause()

On the link below you would see a table of all the methods in activity that you can override. It has one column called killable. Which indicates can this methods be killed. As onDestroy() is a killable methods there is a chance that it may not be called. But onPause() is not killable so u can handle you logic of saving state or anything else here.
Activity

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文