多个活动实例内存不足

时间:2017-08-25 15:26:57

标签: android android-intent memory-leaks

我的内存不足问题。

我在整个应用程序中有一套活动和一个班级。

我在每个活动的清单中将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 activity
newmydialog1 = New mydialog1 (this)
newmydialog1 = New mydialog2 (this)

然后我打电话给

newmydialog1.show

在mydialog1中有一个按钮正在运行

newmydialog2.show

如果我运行mydialog2,我不创建activityC的多个实例,除非我按下运行mydialog2的按钮,这是在相信每个创建的实例的activityC上的内存泄漏。 我尝试调用newmydialog2.cancel / dismiss,然后在mydialog1的cancel()之前将newmydialog2设置为null,但没有。 我还能做什么?

2 个答案:

答案 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()之前。