TabHost 内的 SurfaceView 导致崩溃

发布于 2024-11-07 20:29:35 字数 896 浏览 0 评论 0原文

我在 TabHost 内的 Activity 中有一个 SurfaceView 派生类(如 HelloTabWidget 示例)。我使用的 SurfaceView 附带优秀的 andrtoid-flot-chart 库: FlotChartContainer.java

当我在选项卡之间切换时,一切正常。然而,一旦包含此视图的选项卡被初始化(例如显示),我的应用程序就注定失败。每当发生以下情况时,它就会崩溃:

按主页按钮 当我重新打开应用程序时,它由于 surfaceCreated() 中的 IllegalStateException 而崩溃。

开始新活动 当我启动一个新活动 (startActivity) 并按“后退”按钮(这会调用我的 SurfaceView 的 surfaceDestroyed...?!)时,它会因 IllegalStateException 崩溃在surfaceCreated()中。

  • 我的目标是 API 级别 7 (Android 2.1)。
  • 该代码在不使用 TabHost 时有效。
  • 在选项卡之间切换不会调用 surfaceDestroyed()。相反,使用 onPause() 和 onResume()。
  • 当活动完成时,即使它不在活动选项卡中,也会调用 surfaceDestroyed()。

请帮忙!

I have a SurfaceView-derived class in an Activity inside a TabHost (like the HelloTabWidget sample). The SurfaceView I'm using comes with the excellent andrtoid-flot-chart library: FlotChartContainer.java

When I switch between the tabs, everything works. However, as soon as the tab containing this view has been initialized (e.g. shown) my application is doomed. It will crash whenever the following occurs:

Pressing Home button
When I re-open my application, it crashes due to an IllegalStateException in surfaceCreated().

Starting new activity
When I start a new activity (startActivity) and press the Back button (this invokes my SurfaceView's surfaceDestroyed...?!), it crashes due to an IllegalStateException in surfaceCreated().

  • I'm targeting API level 7 (Android 2.1).
  • The code works when TabHost is not used.
  • Switching between tabs does not invoke surfaceDestroyed(). Instead, onPause() and onResume() are used.
  • When an activity is finished, surfaceDestroyed() is called even if it is not in the active tab.

Please help!

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

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

发布评论

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

评论(2

晌融 2024-11-14 20:29:35

检查 android 中的 Activity 生命周期,同时 onPause() 、 onStop() 、 onDestroy() ,销毁应用程序中已使用的 Surface 视图,并在 onResume() 中重新创建 Surface,然后它就可以正常工作了。

Check activity life cycle in android , while onPause() , onStop() , onDestroy() , destroy the surface view which has been used in your application , and recreate surface in onResume() , then it is working fine.

咿呀咿呀哟 2024-11-14 20:29:35

在尝试了 onPause()onResume()surfaceChanged()surfaceDestroyed() 之后,我终于想到了用一个丑陋的解决方案来解决这个特殊情况:

  • 没有 XML!以编程方式创建的视图。
  • onResume() 中重新创建并重新添加视图。
  • 删除 onPause() 中的视图。

@Karthi_heno
你为我指明了正确的方向。关键是正确处理onPause()。然而,我遇到了奇怪的延迟(大约 10 秒,可能是由于 Canvas.lockCanvas() 调用)...

After experimenting with onPause(), onResume(), surfaceChanged() and surfaceDestroyed() I finally came up with an ugly solution that solves this particular case:

  • No XML! View created programmatically.
  • Re-create and re-add the view in onResume().
  • Remove the view in onPause().

@Karthi_heno
You pointed me in the right direction. The key is to handle onPause() properly. However, I ran into weird delays (some 10 seconds, probably due to Canvas.lockCanvas() calls)...

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