Безопасное объявление объекта RecyclerView: как поле действия или как локальная переменная метода onCreate ()? - PullRequest
0 голосов
/ 18 января 2019

Исходный код:

public class SummaryActivity extends AppCompatActivity
{
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary);

        recyclerView = findViewById(R.id.summary_recycler);
        ...

Android Studio (v3.3) предложила сделать recyclerView локальным для onCreate() метода.

Модифицированный код:

public class SummaryActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary);

        RecyclerView recyclerView = findViewById(R.id.summary_recycler);
        ...

Запускал обе версии несколько раз и не мог заметить никакой разницы. Один лучше другого? Если да, не могли бы вы объяснить, почему? У меня есть предположение, что объявление recyclerView в качестве поля / члена класса безопаснее, однако не хватает понимания, чтобы быть уверенным.

Интересно, что происходит с recyclerView во второй версии после завершения выполнения метода onCreate(). Будет ли сбор мусора позже внезапно уничтожить объект?

Самое близкое, что я нашел по этой теме, было: Создание экземпляра объекта-члена в onCreate и во время объявления , но, к сожалению, это не касается конкретной проблемы, с которой я сталкиваюсь.

Я уверен, что этот вопрос не относится только к RecyclerView объектам в одиночку и что понимание поможет мне более правильно кодировать в будущем, также в других контекстах.

Буду очень признателен за любые разъяснения. Заранее спасибо!

1 Ответ

0 голосов
/ 19 января 2019

Интересно, что происходит с recyclerView во второй версии после завершения выполнения метода onCreate (). Будет ли мусор позже уничтожить объект?

Поскольку объект, о котором мы здесь говорим, это View, который является частью "1006 *" представления содержимого ", он будет уничтожен, только если будет уничтожен Activity в целом.

Существует разница с "обычными" полями: RecyclerView будет создан под капотом, потому что вы вызываете setContentView(R.layout.activity_summary);, и поэтому среда выполнения раздувает файл макета.

В вашем коде вы не создаете экземпляр этого, но присваиваете его переменной, "находя" его:

RecyclerView recyclerView = findViewById(R.id.summary_recycler);

Если вы сохраните переменную локальной, это может улучшить читабельность вашего кода. Но вы должны делать это только в том случае, если вам не нужен доступ к RecyclerView более чем в одном методе, потому что каждый раз, когда вызывается findViewById(), будет выполняться поиск по всему дереву View до View с соответствующий идентификатор найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...