Когда представления внедряются при использовании библиотеки AndroidAnnotations? - PullRequest
1 голос
/ 19 апреля 2019

Мне интересно, когда @ViewById -аннотированные представления внедряются в Android-аннотации. В основном, я хочу знать, безопасно ли получить доступ к одному из этих представлений во время onResume? Я предполагаю, что они вводятся во время onCreate, но хотели бы получить подтверждение.

Спасибо.

1 Ответ

3 голосов
/ 19 апреля 2019

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

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.textView)
    TextView textView;

    @AfterViews
    public void activityTestMethod() {

    }

}
@EFragment(R.layout.fragment_main)
public class MainFragment extends Fragment {

    @ViewById(R.id.imageView)
    ImageView imageView;

    @AfterViews
    public void fragmentTestMethod() {

    }

}

, а затем запустил ./gradlew app:assembleDebug, чтобы заставить Android-аннотации генерировать соответствующие классы MainActivity_ и MainFragment_.Давайте сначала посмотрим на MainActivity_ (нерелевантный код опущен):

public final class MainActivity_
    extends MainActivity
    implements HasViews, OnViewChangedListener
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
        init_(savedInstanceState);
        super.onCreate(savedInstanceState);
        OnViewChangedNotifier.replaceNotifier(previousNotifier);
        setContentView(R.layout.activity_main);
    }

    private void init_(Bundle savedInstanceState) {
        OnViewChangedNotifier.registerOnViewChangedListener(this);
    }

    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
        onViewChangedNotifier_.notifyViewChanged(this);
    }

    @Override
    public void onViewChanged(HasViews hasViews) {
        this.textView = hasViews.internalFindViewById(R.id.textView);
        activityTestMethod();
    }

}

Последовательность событий, которая приводит к тому, что наши представления связаны и наши методы @AfterViews вызывают, выглядит следующим образом:

  • В onCreate экземпляр MainActivity_ регистрируется как OnViewChangedNotifier.
  • onCreate, звонки setContentView.
  • *, 1025 * звонки notifyViewChanged,который запускает (синхронный) вызов onViewChanged.
  • onViewChanged, привязывает все поля, отмеченные @ViewById, , затем вызывает все методы, отмеченные @AfterViews.

Следовательно, @ViewById -аннотированные представления связаны и доступны для использования после вызова onCreate, а @AfterViews -аннотированные методы будут выполняться в конце onCreate и перед любым другим жизненным циклом Activitymethod.

Эта история похожа на MainFragment_:

public final class MainFragment_
    extends com.stkent.aatest.MainFragment
    implements HasViews, OnViewChangedListener
{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
        init_(savedInstanceState);
        super.onCreate(savedInstanceState);
        OnViewChangedNotifier.replaceNotifier(previousNotifier);
    }

    private void init_(Bundle savedInstanceState) {
        OnViewChangedNotifier.registerOnViewChangedListener(this);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        onViewChangedNotifier_.notifyViewChanged(this);
    }

    @Override
    public void onViewChanged(HasViews hasViews) {
        this.imageView = hasViews.internalFindViewById(R.id.imageView);
        fragmentTestMethod();
    }
}

Последовательность событий, которая приводит к тому, что наши представления связаны и наши @AfterViews методы вызывают, выглядит следующим образом:

  • В onCreate экземпляр MainFragment_ регистрируется как вызов OnViewChangedNotifier.
  • onViewCreated.s notifyViewChanged, который запускает (синхронный) вызов onViewChanged.
  • onViewChanged связывает все поля, отмеченные @ViewById, , затем вызывает все методы, отмеченные @AfterViews.

Следовательно, @ViewById -аннотированные представления связаны и доступны для использования после вызова onViewCreated, а @AfterViews -аннотированные методы будут выполнены в конце onViewCreated иперед любым другим методом жизненного цикла фрагмента.

В обоих наших примерах все привязки представлений выполняются в методе жизненного цикла, который происходит намного раньше, чем onResume, поэтому вы можете безопасно получить к ним доступ:)

...