Реализуйте несколько методов для разных уровней API и не делайте, если еще, чтобы решить, какой из них вызывать

Интересно, можно ли реализовать несколько методов для поддержки разных уровней API и вызывать нужный без if(android.os.Build.VERSION.SDK_INT >= ...) else if...?

Я хочу использовать новые функции платформы Android, такие как потоки и т. д. поддержка назад.

Пример:

написал метод

public void myMethod24() {
    // some logic requires api level N(24) and above
}

но мое приложение поддерживает API более низкого уровня, поэтому мне нужен другой метод, совместимый с ними.

вот метод, совместимый для более старых версий:

public void myMethod21() {
    // the same logic, requires api level LOLLIPOP(21) and above
}

Как использовать правильный метод для текущей запущенной версии, не делая этого безобразно, если еще:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    myMethod24();
} else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    myMethod21();
}

Может быть, аннотировать мои методы с помощью @RequiresApi(), @TargetApi или чего-то еще?

я видел этот вопрос, но ответ есть, если еще.


person ronginat    schedule 07.04.2019    source источник
comment
почему вы не хотите использовать android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N)   -  person AADProgramming    schedule 07.04.2019
comment
Я могу использовать эту проверку, но надеюсь, что есть более короткое решение   -  person ronginat    schedule 07.04.2019


Ответы (1)


Как использовать правильный метод для текущей версии, не делая этого безобразно, если еще

Вы не можете. Где-то что-то должно сделать проверку версии и направить на соответствующую логику.

Может быть, аннотировать мои методы с помощью @RequiresApi(), @TargetApi или чего-то еще?

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

В зависимости от того, что вы делаете, существующие классы ...Compat могут обрабатывать проверки версий за вас (например, NotificationCompat.Builder). Если бы вы использовали Kotlin, мы могли бы придумать какой-нибудь причудливый код, скрывающий проверки if. И может быть сторонняя библиотека, которая предлагает генератор кода на основе аннотаций, который генерирует код if проверок.

person CommonsWare    schedule 07.04.2019
comment
Спасибо за ваш ответ. Я знаю, что эти аннотации не являются решением, просто предположил, что есть что-то подобное. Прямо сейчас я хочу использовать java-библиотеку Stream, которая была добавлена ​​в Android. на уровне API 24. - person ronginat; 07.04.2019
comment
Сам проверить версию не проблема, просто искал способ сделать это проще. - person ronginat; 07.04.2019
comment
Как справиться с переопределением метода, который имеет другой уровень поддержки API, например, WebView onReceivedError, одному требуется Build.VERSION_CODES.M или выше, а другому - ниже, чем M. Я не думаю, что создание двух отдельных WebViewClient() является интуитивно понятным подходом. - person Bitwise DEVS; 21.06.2021