2

Я создал очень простую деятельность TempActivity без содержания, просто для целей тестирования. Когда эта активность загружается в Android-телефон, я сделал примерно 40-кратное изменение ориентации, я взял файл кучи как hprof и экспортировал его в инструмент MAT и осмотрел. Он показывает 40 экземпляров моего TempActivity и в каждом случае много классов для просмотра панели действий, таких как linearlayout, imageview и т. Д.Изменение ориентации активности Android, каждый раз новый экземпляр

Каждый раз, когда я поворачиваю экран, DDMS показывает все больше и больше памяти, добавленной в кучу для этого приложения, Это будет сбор мусора через некоторое время? Когда я принудительно сделал GC, все равно он не очистился, и он показал увеличенную память в куче.

Пожалуйста, дайте мне знать, что это поведение Android по умолчанию, можем ли мы сделать что-то, чтобы удалить все предыдущие экземпляры активности? Это случай утечки памяти? Потому что в моем приложении реального времени (с изображениями и другими материалами в contentview), я сталкиваюсь с той же проблемой, когда я поворачиваю экран, каждый раз, когда создается новая активность экземпляра, и размер кучи продолжает расти.

Не из-за по умолчанию ActionBar imageview, linearlayout или других элементов управления автоматически встроены в каждую активность андроида?

Вот мой класс темп деятельности:

[Activity(Label = "TempAcivity", MainLauncher = true)] 
public class TempAcivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Create your application here 
    } 
} 

EDIT

Вот мой файл манифеста и файл стиля, который применяется для нанесения

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="HF.Mobility.Android" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> 
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="21" /> 
<application android:label="Health Hub" android:theme="@style/CustomHoloTheme" android:icon="@drawable/ApplicationIcon" android:allowBackup="false"> 
    <application android:label="@string/ApplicationName"></application> 
</application> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
</manifest> 

Стиль файла:

<?xml version="1.0" encoding="utf-8" ?> 
<resources> 
<style name="CustomHoloTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowActionBarOverlay">true</item> 
    <item name="android:icon">@android:color/transparent</item> 
    <item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item> 
    <item name="android:itemTextAppearance">@style/myCustomMenuTextApearance </item> 
    <item name="android:typeface">monospace</item> 
</style> 

<style name="MyTheme.ActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar"> 
    <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item> 
    <item name="android:background">@drawable/actionbar_background</item> 
</style> 
<style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title"> 
    <item name="android:textColor">#FFFFFF</item> 
</style> 
<style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item"> 
    <item name="android:textColor">@color/xam_green</item> 
</style> 
</resources> 

Вот actionbar_background.xml файл:

<?xml version="1.0" encoding="utf-8" ?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape> 
    <solid android:color="#00000000" /> 
    </shape> 
    </item> 
</layer-list> 
+0

Пожалуйста, ваши файлы манифест. –

+0

Всякий раз, когда вы меняете активность ориентации экрана, снова создавайте, так что onCreate Called everytime. Но если вы хотите управлять объектом или вы не хотите создавать объект каждый раз, тогда вы должны сохранять объект в пакете в методе onSaveInstanceState и проверять его экземпляр в onCreate ... –

+1

Утилизируйте Activity в своем методе 'OnDestroy' для разрыва партнера объектное соединение. Мой другой ответ здесь охватывает то, что происходит более подробно: http://stackoverflow.com/questions/28863058/xamarin-android-finalizer-not-getting-called-when-leaving-the-activity-to-go-to/ 28868582 # 28868582 – matthewrdev

ответ

1

Edit: Делать то, что R описывает @ Matt в его связанного поста, кажется, что лучший способ пойти, и мой ответ ниже более «последней инстанции», это то, как документация на Android также классифицирует его.

Из документации:

Примечание: Обработка конфигурации изменить себя может сделать это гораздо труднее использовать альтернативные ресурсы, так как система автоматически не применять их для вас. Этот метод следует рассматривать как последнее средство, когда вы должны избегать перезапуска из-за изменения конфигурации и не рекомендуется для большинства приложений.

Оригинальное сообщение:

Похоже, добавив, что это ваш AndroidManifest.xml поможет, как это было бы сделать так, что активность не воссоздан на изменение ориентации:

<activity android:name=".TempAcivity" 
      android:configChanges="orientation|screenSize|keyboardHidden" 
      android:label="@string/app_name"> 

Состояние документации этой конфигурации:

Теперь, когда одна из этих конфигураций изменяется, MyActivity не перезапускается. Вместо этого MyActivity получает вызов onConfigurationChanged(). Этот метод передается объекту Configuration, который определяет новую конфигурацию устройства.Читая поля в Конфигурации, вы можете определить новую конфигурацию и внести соответствующие изменения, обновив ресурсы, используемые в вашем интерфейсе. Во время вызова этого метода объект ресурсов вашей активности обновляется для возврата ресурсов на основе новой конфигурации, поэтому вы можете легко сбрасывать элементы своего пользовательского интерфейса без перезапуска системы.

Ссылка: http://developer.android.com/guide/topics/resources/runtime-changes.html

Смотрите этот пост также: How to detect orientation change in layout in Android?

+0

Спасибо @ Daniel-nugent, он отлично работал :) – Suketu

Смежные вопросы