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());

* 編譯,運行,順利搞定! *

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章