activeandroid在android5.0报IncompatibleClassChangeError错误

接手的项目中,之前负责的同事用了ActiveAndroid的数据库开源框架,原本在android4.2和android5.0的系统上用得好好的。可是最近要求更换中间件,而中间件中依赖了httpcore和httpmime,结果就导致了ActiveAndroid闪退了。

java.lang.IncompatibleClassChangeError: org.apache.http.params.SyncBasicHttpParams
    at dalvik.system.DexFile.defineClassNative(Native Method)
    at dalvik.system.DexFile.defineClass(DexFile.java:226)
    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
    at dalvik.system.DexPathList.findClass(DexPathList.java:321)
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:308)
    at com.activeandroid.ModelInfo.scanForModelClasses(ModelInfo.java:187)
    at com.activeandroid.ModelInfo.scanForModel(ModelInfo.java:152)
    at com.activeandroid.ModelInfo.<init>(ModelInfo.java:63)
    at com.activeandroid.Cache.initialize(Cache.java:66)
    at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:44)
    at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:34)
    at com.activeandroid.ActiveAndroid.initialize(ActiveAndroid.java:30)
    at com.eebbk.syncpointread.base.EnglishReadApplication$14.run(EnglishReadApplication.java:254)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:818)

在GitHub上查看了ActiveAndroid的源码,确实是不依赖其他,然而为什么会报这个问题呢?

IncompatibleClassChangeError 从字面理解应该不兼容的类改变引起的错误,因为是更换中间件从而增加了httpcore和httpmime的依赖,所以可以确定是这两个重复了。但是因为是中间件依赖的,不能单纯的去掉,那么是否可以从其他方面规避这个问题,从而使ActiveAndroid正常初始化呢?

通过查看ActiveAndroid 的源码可以知道,ActiveAndroid 有三种初始化方式:

public static void initialize(Context context) {
    initialize((new Builder(context)).create());
}

public static void initialize(Configuration configuration) {
    initialize(configuration, false);
}

public static void initialize(Context context, boolean loggingEnabled) {
    initialize((new Builder(context)).create(), loggingEnabled);
}

public static void initialize(Configuration configuration, boolean loggingEnabled) {
    setLoggingEnabled(loggingEnabled);
    Cache.initialize(configuration);
}

原来是通过

ActiveAndroid.initialize(context);

初始化ActiveAndroid。

换成用以下方式初始化:

Configuration.Builder configurationBuilder = new Configuration.Builder(context);
configurationBuilder.addModelClass(Address.class); 
configurationBuilder.addModelClass(HardWord.class); 

ActiveAndroid.initialize(configurationBuilder.create());

** 编译,运行,顺利搞定! **

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,729评论 25 709
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,174评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,212评论 19 139
  • 上周六,在英语学习研究会上做了一期写作与阅读个人分享。 借着这次机会,又重新回顾了一下写作的历程。从最初的几...
    言西小熊阅读 4,502评论 10 21
  • 入院待产第二天 2017-03-15 早上五点被叫醒扎了一针后,就没再睡了,想了想一晚上大概也就睡了两三个小时~ ...
    70e05b1b737e阅读 1,580评论 0 0

友情链接更多精彩内容