跨多个Android版本实现SharedReference

跨多个Android版本实现SharedReference,android,backwards-compatibility,Android,Backwards Compatibility,对于我的应用程序,我有一个SharedReferences的自定义实现 在API级别9中,apply方法被添加到SharedReferences.Editor界面 然而,如果我将该方法添加到我的实现中并尝试使用它,Android 1.6会抛出一个VerifyError 以向后兼容的方式实现此功能的最佳方法是什么 编辑: 我应该澄清我的难题。在我转向以姜饼为目标之前,我的SharedReferences.Editor实现没有包括apply方法。切换目标后,它停止编译,因为我的实现中缺少该方法 添加

对于我的应用程序,我有一个
SharedReferences
的自定义实现

在API级别9中,apply方法被添加到
SharedReferences.Editor
界面

然而,如果我将该方法添加到我的实现中并尝试使用它,Android 1.6会抛出一个
VerifyError

以向后兼容的方式实现此功能的最佳方法是什么

编辑:

我应该澄清我的难题。在我转向以姜饼为目标之前,我的
SharedReferences.Editor
实现没有包括
apply
方法。切换目标后,它停止编译,因为我的实现中缺少该方法

添加该方法的实现修复了编译问题,但添加了一个新问题:Android 1.6甚至不会加载该类,抛出一个
VerifyError
。即使我发现了错误,我的自定义实现也永远不会加载到1.6上


到目前为止,我的最佳想法是使我自己的接口与SharedReferences和SharedReferences.Editor完全相同,并实现它们。当然,这需要在我的代码中进行彻底的更改,所以如果可能的话,我会尽量避免这种情况。

如果您愿意放弃对Android 1.x的支持,您可以将其放入
if()
测试中,类似于:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD) {
    editor.apply();
}
else {
    editor.commit();
}
但是,如果您确实需要支持Android 1.6,则需要将新的API代码隔离在一个只在新API设备上加载的类中,即所谓的“条件类加载”技术


演示如何使用此技术解决您的问题。

如果您愿意放弃对Android 1.x的支持,您可以将其放入
If()
测试中,类似于:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.GINGERBREAD) {
    editor.apply();
}
else {
    editor.commit();
}
但是,如果您确实需要支持Android 1.6,则需要将新的API代码隔离在一个只在新API设备上加载的类中,即所谓的“条件类加载”技术


演示如何使用此技术解决您的问题。

捕获验证错误并提交
commit
。现在到底是谁运行1.6?不幸的是,这不允许我实际使用自定义实现。捕获VerifyError并
提交
。谁现在运行1.6?不幸的是,这不允许我实际使用自定义实现。不幸的是,我的问题不是调用apply方法。我的问题是,我有一个SharedReferences的自定义实现,添加apply方法会导致1.6完全拒绝我的类,即使从未调用apply方法。@Brigham:您将需要两个单独的自定义实现,一个带有
apply()
,另一个没有,并且只尝试使用
apply()
姜饼和更高的,听起来很合理。我唯一关心的是如何使其编译。@Brigham:您必须将构建目标设置为姜饼或更高。不幸的是,我的问题不是调用apply方法。我的问题是,我有一个SharedReferences的自定义实现,添加apply方法会导致1.6完全拒绝我的类,即使从未调用apply方法。@Brigham:您将需要两个单独的自定义实现,一个带有
apply()
,另一个没有,并且只尝试使用
apply()
姜饼和更高的,听起来很合理。我唯一关心的是如何使它编译。@Brigham:你必须将构建目标设置为姜饼或更高。