我从这里开始关注"避免内存泄漏"一文.
然而,所提出的解决方案不能解决泄漏问题.我在Windows XP(SDK 2.3.1)上使用Android模拟器测试了这个.我倾倒堆并检查主要活动仍在堆中(我使用了MAT)
这是我做的:
HelloWorldActivity < - PhoneWindow $ DecorView < - InputMethodManager
InputMethodManager是一个单例和三个引用DecorView的引用,它引用了HelloWorldActivity.
我无法理解为什么InputMethodManager仍然引用DecorView实例,即使在活动被销毁之后.
是否有任何方法可以确保主要活动在关闭之后被销毁并且GC能够?
android garbage-collection android-activity inputmethodmanager
介绍:
我有一个具有以下结构的应用程序:ActionBar up top(ActionBarSherlock)ViewPagerIndicator(用于标签)ViewPager(hosts Fragments)
我有一个问题,我的一个片段导致相当大的内存泄漏.我将问题缩小到以下情况:
导致泄漏的碎片只会在其onCreateView方法中使布局膨胀.这是通过以下方式完成的:
return inflater.inflate(R.layout.filter_auctions_fragment, container, false);
Run Code Online (Sandbox Code Playgroud)
这里没什么不寻常的.
布局文件只包括一个ScrollView,LinearLayout两个EditText,它出现(包括更正常的东西,但我将问题范围缩小到只有这些意见,以使简单).
现在用于添加片段的代码:mTabsAdapter.addTab(tabName,ProblematicFragment.class);
mTabsAdapter是一个TabsAdapter扩展FragmentPagerAdapter支持库的类的实例.它是相当标准的,所以我不包括使这个问题尽可能短的来源.
现在有趣的部分:
这是当我来回旋转设备几次时堆发生的事情:
12-28 12:26:27.180: D/dalvikvm(18841): GC_CONCURRENT freed 530K, 7% free 10701K/11436K, paused 4ms+7ms, total 58ms
12-28 12:26:27.180: D/dalvikvm(18841): WAIT_FOR_CONCURRENT_GC blocked 24ms
12-28 12:26:28.270: D/dalvikvm(18841): GC_CONCURRENT freed 737K, 8% free 11048K/11964K, paused 4ms+5ms, total 53ms
12-28 12:26:29.510: D/dalvikvm(18841): GC_CONCURRENT freed 789K, 8% free 11464K/12436K, paused 5ms+5ms, total 42ms
12-28 12:26:30.640: D/dalvikvm(18841): GC_CONCURRENT freed …Run Code Online (Sandbox Code Playgroud) 视图层次结构如下TabActivity- > ActivityGroups- > Activities.
使用MAT我发现TabWidget被引用的TabHost引用InputMethodManager,因此TabWidget被泄露.在后续启动应用程序时抛出OutOfMemory错误.
同样,我的所有活动也被引用InputMethodManager.(关闭应用程序后,我的所有活动组,活动,tabactivity,tabhost和tabwidget都被泄露!!)
在正确完成应用程序(按回键)后,将在logcat中显示以下内容
WARN/InputManagerService(99):在非聚焦客户端上启动输入com.android.internal.view.IInputMethodClient$Stub$Proxy@44a87748(uid = 10052 pid = 1463)
如何从InputMethodManager...中删除引用?
我尝试过:
A.称onDestroy我的这种方法TabActivity
1. myTabWidget.removeAllViews()
2.myTabWidger.invalidate()
没运气!