Activity 泄露了原本绑定在这里的 ServiceConnection com.google.android.youtube.player
Posted
技术标签:
【中文标题】Activity 泄露了原本绑定在这里的 ServiceConnection com.google.android.youtube.player【英文标题】:Activity has leaked ServiceConnection com.google.android.youtube.player that was originally bound here 【发布时间】:2013-11-17 09:27:14 【问题描述】:我正在使用一个具有 android.support.v4.view.ViewPager 布局的 Activity,该布局用于操作 Tab 导航。我对不同的标签有不同的片段。在我的第三个选项卡上,我正在从我的 YouTube 帐户加载一些 YouTube 缩略图。
当我加载应用程序(当我停留在第一个选项卡时)并按返回退出应用程序时,它存在没有任何问题。但是当我导航到第二个选项卡并尝试按返回按钮时,应用程序存在并出现如下错误。
E/ActivityThread(7187): Activity package.name.ActivityName has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41e5d180 that was originally bound here
E/ActivityThread(7187): android.app.ServiceConnectionLeaked: Activity package.name.ActivityName has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@41e5d180 that was originally bound here
我已将 YouTube Data API v3 添加到我的项目中。
我该如何解决这个问题? 为什么从第二个选项卡退出时出现错误,但在第一个选项卡中没有?
这不是this 的重复问题。
【问题讨论】:
如果我猜对了,你会在第二页出现时加载 api,然后再初始化 YouTube API。不要将您的活动作为上下文提供,而是尝试将应用程序上下文提供给 api @TacB0sS 太棒了...错误消失了。将此作为答案,我会接受。 【参考方案1】:我在TabLayout
中使用了一个片段来启动一个 Youtube 视频 Intent。该应用程序运行正常,但 Logcat
显示此错误。我发现 缩略图加载器 在加载后没有释放(取决于有效的视频 ID)。它解决了我的问题。
【讨论】:
【参考方案2】:如果我猜对了,你会在第二页出现时加载 api,然后再初始化 YouTube API。不要将您的活动作为上下文提供,而是尝试将应用程序上下文提供给 api。
【讨论】:
我想很多人会不同意我的下一个陈述,但我相信除了管理活动堆栈之外,没有理由将您的活动作为上下文提供任何内容。 出于任何其他原因,我认为开发人员应该提供应用程序上下文,并进行 SMART 上下文管理,因为在大多数情况下,上下文的生命周期使用超出了任何特定的范围应用程序中的实体,应用程序的实体除外! 您能否解释一下为什么 OP 的方法存在缺陷并且提供应用程序上下文是合适的?我认为只有在您想尽可能长时间地保留引用时才使用应用上下文? 当然,如果您能想出任何您想使用的功能(实用程序/3rd 方库/api),它们在同一个“屏幕”(活动)中生死攸关,那么很好,你可以使用 Activity 作为你的上下文。我是一个,每次我尝试过之后,我很快就意识到我的主要假设是错误的......我也想在其他地方使用这个功能,因此我已经管理了这个功能的生命周期在应用程序中,使用 ApplicationContext 跨活动。 -- 希望这很清楚...... 几乎找不到答案,但非常有意义并解决了我的问题!应该有更多的积分...以上是关于Activity 泄露了原本绑定在这里的 ServiceConnection com.google.android.youtube.player的主要内容,如果未能解决你的问题,请参考以下文章
Activity 泄露了 IntentReceiver - LollipopBrowserAccessibilityManager
ProgressDialog.show() - Activity 已泄露窗口