gpt4 book ai didi

安卓兼容性。使用 Build.VERSION_CODES 时我很困惑

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:35 25 4
gpt4 key购买 nike

Log.d(TAG, "Build.VERSION_CODES.ICE_CREAM_SANDWICH: " + Build.VERSION_CODES.ICE_CREAM_SANDWICH);

我是这样写代码的,我是用sdk4.0编译这个android程序的,所以没有编译错误。当我在运行 android 2.3.4 的手机上运行这个程序时,它运行良好。

为什么?我很困惑版本 2.3.4(api 级别 10)有 Build.VERSION_CODES.ICE_CREAM_SANDWICH 属性?而且我用sdk2.3.4的时候会编译出错。

更多

我测试了下面这些代码,

private ScaleGestureDetector mScaleGestureDetector;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) {
mScaleGestureDetector = new ScaleGestureDetector(this, new MyOnScaleGestureListener());
}

此代码将在 android 1.6 api level 4 上运行良好,但是

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) {
Log.d(TAG, "getx(0): " + event.getX(0));
}

此程序在 android 1.6 api 级别 4 上运行失败。

它们都在 android 2.3.4 上运行良好。

为什么? (在 ScaleGestureDetector 类中也使用 event.getX(0)(自 api 级别 5 起))

我测试了一些代码..

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Fragment f = new Fragment();

}

当我在 android 1.6 模拟器上运行它时它抛出 java.lang.VerifyError,但是在我运行 android 2.3.4 的手机上它抛出 java.lang.NoClassDefFoundError。

为什么??

最佳答案

这并不像看起来那么奇怪。它与 Java 如何处理原语的常量值有关。在编译期间,常量的值放在字节码中,而不是对实际常量的引用。

例如:

Log.d(TAG, "Build.VERSION_CODES.ICE_CREAM_SANDWICH: " + Build.VERSION_CODES.ICE_CREAM_SANDWICH);

实际上会被编译器翻译成:

Log.d(TAG, "Build.VERSION_CODES.ICE_CREAM_SANDWICH: " + 14);

因此删除了对实际常量(和类)的引用。

关于不为您运行的代码,它与 MotionEvent.getX(int n) 方法直到 api 级别 5 才可用有关。在此之前,多点触控是不支持,因此除了 getX() 之外不需要任何其他方法。

其实调用不存在的方法也没关系。在平台加载和验证类时出现错误。您很可能会在日志中收到 VerifyError,因为它会发现您在验证期间试图调用不存在的方法。

另一方面,如果您尝试使用一个不存在的类,您将得到一个 ClassNotFoundException。请注意,有时,即使文档没有说明,Android 中也存在一个类。有些类存在于 Android 的早期版本中,但直到后来才公开。有些人甚至走了另一条路。

所以:

尝试使用不存在的类 - ClassNotFoundException尝试使用存在的类上不存在的方法 - VerifyError

(在使用 Fragments 时,它们可用于早期版本的独立 Android Support Library )

关于安卓兼容性。使用 Build.VERSION_CODES 时我很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8200658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com