我们(Evernote)做了额外的工作来支持 1.6 并尽可能多地使用新的 API。支持 1.6 的主要问题是 Dalvik 对您的类进行了贪婪搜索。这使得无法使用类似的代码
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
prefEditor.apply();
} else {
prefEditor.commit();
}
因为它会抛出一个类验证错误。这是当 dalvik 看到您的方法并尝试在运行时访问它时引起的。
相反,您需要使用帮助类来为 SDK 实例化适当的类。是的,这是更多的工作
public abstract class SharedPreferenceEditor {
private static SharedPreferenceEditor sInstance;
public static SharedPreferenceEditor getInstance() {
if (sInstance == null) {
/*
* Check the version of the SDK we are running on. Choose an
* implementation class designed for that version of the SDK.
*/
@SuppressWarnings("deprecation")
int sdkVersion = Build.VERSION.SDK_INT;
if(Evernote.DEBUG)Log.d("SharedPreferenceEditor", "sdkVersion=" + sdkVersion);
if (sdkVersion < Build.VERSION_CODES.GINGERBREAD) {
sInstance = new CommitSharedPreferenceEditor();
} else {
sInstance = new ApplySharedPreferenceEditor();
}
}
return sInstance;
}
public abstract void save(SharedPreferences.Editor editor);
}
然后你有一个姜饼+ api级别
public class ApplySharedPreferenceEditor extends SharedPreferenceEditor {
public void save(SharedPreferences.Editor editor) {
editor.apply();
}
}
一个用于<姜饼级别
public class CommitSharedPreferenceEditor extends SharedPreferenceEditor{
public void save(SharedPreferences.Editor editor) {
editor.commit();
}
}
我建议支持 2.1 及更高版本,这样您就可以利用对 Dalvik 的改进并使用我列出的第一个示例。