Объект пользовательского интерфейса, созданный с помощью XML, не обрабатывается в Android Marshmallow

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

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

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

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

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

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

Например Button b = новая кнопка (контекст c);

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

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

БР, Рахул

Solutions Collecting From Web of "Объект пользовательского интерфейса, созданный с помощью XML, не обрабатывается в Android Marshmallow"

Вы не указали какие-либо примеры кода, о чем вы говорите. Я могу только догадываться, что вы на самом деле создаете эти объекты 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 будет вызван сразу после уничтожения Activity. В основном это называется, когда это необходимо. Если вы хотите помочь «заставить» GC вызываться, когда действие уничтожено, тогда очистите его в onDestroy () Activity. Ура!

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

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

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

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