我的内存不足问题。
我在整个应用程序中有一套活动和一个班级。
我在每个活动的清单中将launchMode
设置为SingleTop
,将noHistory
设置为true。
我还设置了android: largeHeap = "true"
我称之为A,B,C,D,E的一个主要活动和另外五个活动
A,B,C始终在HEAP中显示单个实例,但每次新Intent及其startActivity时,D和E都会增加实例数
C使用D和E中也使用的相同对象(listview,hashmap,simpleAdapter)
发生这种情况:
主启动,然后启动C,C调用D和D调用E并返回C.C总是有一个实例,而D和E每次占用1 MB指示他们的实例,最终导致Oom叠加174Mb可用对于我的应用程序。
对于所有活动,我运行此代码,例如来自activityB,startC,activityC。
Intent activityC = new Intent (getBaseContext, activityC.class); // Try too getApplicationContext, activityC.this but instances remain anyway.
activityC.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); // I try too SINGLE_TOP, NEW_TASK, CLEAR_TASK same result
Finish (); // I also tried to call finish () after startActivity () with the same result
startActivity (activityC);
这一切都毫无价值。
我还使用freeMemory()
函数来调用每个活动的onDestroy()
,但有或没有更改
Public void freeMemory () {
System.runFinalization ();
Runtime.getRuntime (). Gc ();
System.gc ();
}
我已经尝试过实施onNewIntent
但我从来没有得到它。
在D和E中onDestroy
我试图将onCreate()
中创建的所有对象(私有)设置为null,但不成功。
目前我正在尝试使用华硕和Android 5.02平板电脑。
不要使用Handler,Timer或AsyncTask。
我做了多少努力(我真的尝试了很多)A,B,C总是在HEAP中显示单个实例而D和E
我还创建了一个试图集中解决问题的演示,但我没有得到结果。在SINGLE_TOP演示中,您可以按预期工作,并为每个活动保留一个实例,使其超出重复次数。
什么可以保留新实例?
清单:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".TEST"
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ActivityA"
android:hardwareAccelerated="false"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ActivityE"
android:enabled="true"
android:hardwareAccelerated="false"
android:label="@string/app_name"
android:launchMode="singleTop"
android:noHistory="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" />
<activity
android:name=".ActivityD"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:noHistory="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".ActivityC"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:noHistory="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".ActivityB"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:noHistory="true"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity android:name=".TempActivity"
android:launchMode="singleTop"
android:noHistory="true"
/>
</application>
</manifest>
我注意到当你从一个活动切换到另一个logcat时告诉我: 08-26 08:22:33.607 905-5207 /? W / ActivityManager:从完成ActivityRecord {6d2eb11 u0 danielezampieri.TEST / .ActivityC t472 f}调用的startActivity;强制Intent.FLAG_ACTIVITY_NEW_TASK:Intent {flg = 0x24020000 cmp = danielezampieri.TEST / .ActivityD} 因为?这是什么意思?可能是因为ActivityC生成了多个实例吗?
但是,我在startactivity之后评论了finish()方法,只有上面提到的活动显示了多个实例。
UPDATE !! 我专注于产生问题的观点。无论如何,感谢您的建议。 在activityC(显示多个实例并占用无用内存的那个)中,我有两个扩展Dialog的类,使用
创建它们的oncreate of activitynewmydialog1 = New mydialog1 (this)
newmydialog1 = New mydialog2 (this)
然后我打电话给
newmydialog1.show
在mydialog1中有一个按钮正在运行
newmydialog2.show
如果我运行mydialog2,我不创建activityC的多个实例,除非我按下运行mydialog2的按钮,这是在相信每个创建的实例的activityC上的内存泄漏。 我尝试调用newmydialog2.cancel / dismiss,然后在mydialog1的cancel()之前将newmydialog2设置为null,但没有。 我还能做什么?
答案 0 :(得分:0)
如果C&amp; D&amp; E分享相同的对象为什么不让ActivityC在你的C&amp; C的内容之间有一个ViewFlipper
来“翻转”。 D&amp; E,如果您有很多图像,请尝试缩小它们或重新使用它们而不是每次都创建它们...如果您在翻转视图时担心滞后,请尝试使用Async-task,例如,创建创建活动时D的内容...使用RecyclerViews
可能会有所帮助,而不是ListViews
.....我希望我帮助过你:)
答案 1 :(得分:0)
问题解决方案
mydialog2的新范围必须在mydialog1类中,并且在newmydialog2.show()之前。