2013-11-28 2 views
2

код, такой как:Проверяет SDK_INT достаточно или ленивая загрузка, необходимая для использования новых API-интерфейсов Android? Зачем?

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) 
     ed.apply(); 
    else ed.commit(); 

производит предупреждение в Froyo:

04-27 03: 40: 35.025: W/dalvikvm (3138) VFY: не в состоянии решить метод интерфейса 219: Landroid/содержание/SharedPreferences $ Editor; .Не() V

Но я понимаю, что в более старых устройствах это будет RuntimeError, который бы прервать программу (см here и here).

Таким образом, этот способ условного вызова новых API (методов) безопасен в API 8 (Froyo) и выше или случаи, когда по-прежнему нужна ленивая загрузка?

Какие изменения на Dalvik сделали это возможным?

Связанные

ответ

4

производит предупреждение в Froyo

Это совершенно нормально.

Но я понимаю, что в более старых устройствах это будет RuntimeError, который отменит применение

для Android 1.x, да.

Так это способ условно вызова новых API (методы) безопасны в API 8 (Froyo) и выше

Да.

Какие изменения на Dalvik сделали возможным?

Он больше не «терпит неудачу», когда сталкивается с неопознанным символом, но вместо этого ждет, чтобы попытаться снова разрешить его при выполнении инструкции. Проверяя SDK_INT и убедитесь, что оператор не выполнен, вы не сработаете.

+2

Изменения, которые сделали возможным, это переход от немедленного отказа от класса, заметив какую-либо проблему в режиме, когда некоторые проблемы являются фатальными, а другие приводят к встроенной инструкции «бросить всегда». Это подробно описано в http://milk.com/kodebase/dalvik-docs-mirror/docs/verifier.html. – fadden

+0

Помимо использования отражения, существует ли способ подавить предупреждение о регистрации? – scottt

+0

Так что, кроме использования отражения или внутренних классов, существует ли способ подавить сообщение журнала? – scottt