簡體   English   中英

活動的多個實例內存不足

[英]Multiple Instance of Activity Out of memory

我有一個內存不足的問題。

我在整個應用程序中都有一組活動和一個類。

我的設置launchModeSingleTopnoHistory為true在清單每個活動。 我還設置了android: largeHeap = "true"

我稱一項主要和其他五項活動為A,B,C,D,E

A,B,C始終在HEAP中顯示單個實例,但每次新的Intent及其startActivity時,D和E都會增加實例數

C使用相同的對象(listview,hashmap,simpleAdapter),它們也用在D和E中

有時候是這樣的:

主引導,然后引導C,C調用D,D調用E並返回C。C始終有一個實例,而D和E每次占用1 MB的內存來指示其實例,最終導致Oom疊加我的App可用的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,但未成功。

目前,我正在嘗試使用Asus和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>

我注意到當您從一個活動切換到另一個日志時,告訴我: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()方法,只有上面提到的活動顯示了多個實例。

更新! 我着重指出了產生問題的原因。 無論如何要感謝您的建議。 在activityC(顯示多個實例並占用無用的內存的那個)中,我有兩個擴展Dialog的類,它們是在活動的oncreate中使用以下命令創建的

newmydialog1 = New mydialog1 (this)
newmydialog1 = New mydialog2 (this)

然后我打電話

newmydialog1.show

在mydialog1中,有一個正在運行的按鈕

newmydialog2.show

如果運行mydialog2,則不會創建activityC的多個實例,除非我按下運行mydialog2的按鈕,否則這是ActivityC上的內存泄漏,它相信每個創建的實例。 我嘗試調用newmydialog2.cancel / dismiss,然后在mydialog1的cancel()之前將newmydialog2設置為null,但沒有執行任何操作。 我還可以做些什么?

如果C&D&E共享相同的對象,為什么不讓ActivityC使用ViewFlipper在C&D&E的內容之間“翻轉”,並且如果您有很多圖像,請嘗試按比例縮小或重新使用它們它們而不是每次都創建它們...並且如果您擔心在翻轉視圖時滯后,則嘗試使用異步任務來例如在創建Activity時創建D的內容...另外使用RecyclerViews可能會有所幫助ListViews .....我希望我在某些方面對您有所幫助:)

問題方案

mydialog2的新距離必須在mydialog1類中並且在newmydialog2.show()之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM