8

Я работаю над портированием зефира для некоторых аппаратных средств. Проблема, с которой я столкнулся, заключается в том, что если я создаю объект UI через xml, он не будет подметаться GC. Например:Объект пользовательского интерфейса, созданный с помощью XML, не подметается в Android Marshmallow

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

Если я определяю кнопку в макете xml и в действии setcontentview, он создаст объект типа кнопки. Теперь я снова и снова переключаю эти действия, чтобы создать несколько объектов кнопки, так как я не использую LAUNCH_MODE (намеренно).

Теперь давайте предположим, что создано 8 объектов Button. Несколько раз я нажал кнопку «Назад» и вышел на главный экран. Я инициировал GC из Android Studio. После этого, если я возьму кучу кучи, все же я нахожу 8 экземпляров Button, но «идентификаторы объектов изменены». Более того, я видел, что конструктор класса Button не вызывается после того, как я начал GC.

Итак, кто создал эти объекты. И если это те же объекты, почему идентификаторы были изменены.

То же самое, если я путем создания объекта Button с помощью кнопок класса Java,

как кнопка B = новая кнопка (контекст с);

объекты подметаются.

Пожалуйста, поставьте немного света, если вы понимаете проблему.

BR, Рахул

+2

Не могли бы вы поделиться [mcve]? – antonio

ответ

0

Вы не дали каких-либо примеров кода для того, что вы говорите. Я могу только догадываться, что вы на самом деле создание этих объектов Button, как вы упомянули,

Button b = new Button(this); 

Если вы ссылаетесь на кнопку виджета в XML, то вы не должны создавать какие-либо объекты Button, вы должны быть инстанцирование только объекта.

Кнопка создана в XML

<Button 
    android:id="@+id/btn_action" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

Инстанцирование кнопки в коде

Button btnAction = (Button) findViewById(R.id.btn_action); 

Эта кнопка объект не должен иметь несколько ссылок идентификаторов. Когда вы назначаете идентификатор этому виджету в XML, ссылочный идентификатор немедленно добавляется в ваш файл R.java. Проверьте файл R.java, вы увидите что-то вроде

public static final int btn_action=0x7f0d033b; 

Это окончательное значение, его нельзя изменить. Поэтому каждый раз, когда вы ссылаетесь на объект, btnAction, вы ссылаетесь на 0x7f0d033b. Уничтожение вашей активности уничтожит этот объект, если вы не делаете что-то нечетное, как создание статических объектов.

Также обратите внимание, что нет гарантии, что GC будет вызван сразу же после уничтожения Действия. В основном это называется, когда это необходимо. Если вы хотите помочь «заставить» GC вызываться, когда действие уничтожено, то очистите его в onDestroy() Activity. Ура!

@Override 
protected void onDestroy() { 
    // invoke garbage collector 
    System.gc(); 
} 

Также имейте в виду, что вызов System.gc() не обязательно означает, что будет вызываться сборщик мусора. Определением для этого является

Указывает VM, что было бы подходящим временем для запуска мусора коллекционер. Обратите внимание, что это только подсказка. Нет никакой гарантии, что на самом деле будет запущен сборщик мусора .

+0

На самом деле я стараюсь оба. С: Кнопка b = новая кнопка (это); Объекты кнопки прокручиваются, как только я начинаю GC. С: XML-способ Объекты кнопки не отображаются, когда я запускаю GC. Я понимаю, что GC не гарантируется, но я инициирую его с монитора Android, который должен подметать все объекты с привязкой. – Rahul

0

Нет необходимости в новой кнопке, кнопка уже определена в манифесте, просто используя findViewById, чтобы найти ее.