Поток аннотаций
Поток аннотации может проверять, был ли метод вызван из определённого типа потока. Поддерживаются следующие аннотации потока:
@MainThread: указывает, что помеченный метод должен вызываться только в основном потоке. Если помечен класс, все методы в классе должны вызываться в основном потоке. Пример: (обычно основным потоком приложения является поток пользовательского интерфейса (UI). Однако в особых случаях основной поток приложения может не быть его потоком UI).
@MainThread public void deliverResult(D data) { ... }
@UiThread: указывает, что помеченный метод или конструктор должен вызываться только в потоке пользовательского интерфейса. Если помечен класс, все методы класса должны вызываться в потоке пользовательского интерфейса. Пример:
@UiThread public abstract void setText(@NonNull String text) {...}
@WorkerThread: указывает, что помеченный метод должен вызываться только рабочим потоком. Если помечен класс, все методы класса должны вызываться рабочим потоком. Пример:
@WorkerThread protected abstract FilterResults performFiltering(CharSequence constraint);
@BinderThread: указывает, что помеченный метод должен вызываться только связывающим потоком. Если помечен класс, все методы класса должны вызываться связывающим потоком. Пример:
@BinderThread public BeamShareData createBeamShareData() { ... }
@AnyThread: указывает на то, что помеченный метод можно вызывать из любого потока. Если помечен класс, все методы класса могут вызываться из любого потока. Пример:
@AnyThread public void deliverResult(D data) { ... }
Инструменты сборки рассматривают аннотации @MainThread и @UiThread как взаимозаменяемые, поэтому мы можем вызывать метод @UiThread из метода @MainThread, и наоборот. Однако, если в системе есть несколько попыток, связанных с разными потоками, поток UI может отличаться от основного потока. Поэтому мы должны использовать аннотацию @UiThread для методов, связанных со слоем представления приложения, а аннотацию @MainThread — только для методов жизненного цикла приложения.
Ресурсная аннотация
В Android почти все ресурсы имеют соответствующий идентификатор, который мы можем использовать напрямую при использовании, например:
textView.setText(getResources().getText(R.string.app_name));
Однако это может привести к ошибкам, если мы передадим случайное значение, например 0, тогда соответствующий ресурс не будет найден. Чтобы избежать ошибок, вызванных нашей невнимательностью, мы можем использовать ресурсные аннотации, такие как:
public int getText(@StringRes int id){ }
При вызове этого метода, если переданный параметр не является идентификатором ресурса String, компилятор выдаст ошибку.
Помимо аннотации @StringRes, существуют и другие:
@IntegerRes: тип ресурса R.integer. @AnimatorRes: тип ресурса R.animator. @AnimRes: тип ресурса R.anim. @ArrayRes: тип ресурса R.array. @AttrRes: тип ресурса R.attr. @BoolRes: тип ресурса R.bool. @ColorRes: тип ресурса R.color. @DimenRes: тип ресурса R.dimen. @DrawableRes: тип ресурса R.drawable. @FractionRes: тип ресурса R.fraction (процент). @IdRes: тип ресурса R.id. @InterpolatorRes: тип ресурса R.interpolator (интерполятор). @LayoutRes: тип ресурса R.layout. @MenuRes: тип ресурса R.menu. @PluralsRes: тип ресурса R.plurals (множественное число). @RawRes: тип ресурса R.raw. @StyleableRes: тип ресурса R.styleable. @StyleRes: тип ресурса R.style. @TransitionRes: тип ресурса R.transition. @XmlRes: тип ресурса R.xml. @AnyRes: неизвестный ресурс (неизвестный тип ресурса. Может быть R.drawable или R.string).
@ColorInt
Аннотация @ColorInt используется для ограничения значения цвета (ARGB: 0xAARRGGBB):
public void setColor(@ColorInt int color) { }
Если вы используете идентификатор ресурса напрямую, вы получите сообщение об ошибке, например:
setColor(R.color.colorAccent)// ошибка
Правильное использование:
setColor(0xFFFF00FF);
Если вам нужно использовать идентификатор ресурса, вы можете использовать метод ContextCompat.getColor():
setColor(ContextCompat.getColor(context, R.color.colorAccent));
@CallSuper
Эта аннотация используется для украшения метода и означает, что при переопределении этого метода необходимо вызвать метод super. Например, метод onCreate():
@CallSuper protected void onCreate(Bundle savedInstanceState) { }
Когда вы переопределяете метод onCreate(), вы должны вызвать метод super:
super.onCreate(savedInstanceState);
иначе вы получите ошибку.
@VisibleForTesting & @Keep
Аннотации @VisibleForTesting и @Keep используются для обозначения доступности методов, классов или полей.
@VisibleForTesting: эта аннотация служит только комментарием, информирующим других разработчиков о том, почему код имеет такой уровень видимости (для удобства тестирования). Поэтому она часто используется для декорирования public или protected, использование её для декорирования private не вызовет ошибки, но будет бессмысленным.
@Keep: помеченный код не будет запутан при обфускации.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарий ( 0 )