gpt4 book ai didi

Android StrictMode InstanceCountViolation

转载 作者:IT王子 更新时间:2023-10-28 23:47:33 28 4
gpt4 key购买 nike

我正在运行我的应用程序,并在开发中激活了 StrictMode,如此处所述 StrictMode for lower platform versions并注意到一条错误消息,我不知道该怎么想,也找不到任何引用。

我得到一个 android.os.StrictMode$InstanceCountViolation,其中包含 instanceslimit 的值,例如

instances=3; limit=2

现在我想知道:

  • A) 限额是如何计算的
  • B) 这种违规行为怎么会发生,然后我会调查规避行为。

有什么想法吗?

最佳答案

一切尽在代码中

key 是StrictMode.sExpectedActivityInstanceCount and incrementExpectedActivityCount and decrementExpectedActivityCount :

所以每次销毁 Activity 时 limit 都会减少,但是如果实例泄漏,实际实例计数将大于限制,为了检测它是否泄漏,他们会执行一些 GC 魔术(在 decrementExpectedActivityCount):

    System.gc();
System.runFinalization(); // added in https://github.com/android/platform_frameworks_base/commit/6f3a38f3afd79ed6dddcef5c83cb442d6749e2ff
System.gc();

如果在此之后 GC 没有从应用程序的内存中删除 Activity,则将其视为泄漏。

结论

基于上述情况,唯一的预防方法是确保在 onDestroy 之后没有对违规 Activity 的引用。问题是有些可能有一些 WeakReference 仍然可以通过一些 native 对象访问,这些 native 对象似乎具有不同的生命周期。我是这样得出这个结论的:

  • MyActivity 退出并查看日志消息后
  • 进行堆转储 (.hprof)
  • Eclipse 内存分析器中打开它
  • 运行 OQL:select * from instanceof full.package.name.of.MyActivity
  • 使用 Ctrl+ClickShift+Click
  • 全选
  • 右键单击并Merge Shortest Path to GC Roots > 与所有引用

解决方法

如果我们 increase the count initially在它报告特定类的泄漏之前,我们将有更多的伸腿空间:

// Application.onCreate or nearby where you set up StrictMode detectActivityLeaks
Method incrementExpectedActivityCount = StrictMode.class.getMethod("incrementExpectedActivityCount", Class.class)
incrementExpectedActivityCount.invoke(null, MyActivity.class);
incrementExpectedActivityCount.invoke(null, MyActivity2.class);

进一步阅读

关于Android StrictMode InstanceCountViolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956132/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com