1

整合事件總線圖書館及其工作罰款OS版本5.0及以上,但引起的異常較低的版本像4.4等,並收到此錯誤後,java.lang.NoClassDefFoundError而註冊eventbus在OnStart方法4.4操作系統版本

java.lang.ExceptionInInitializerError at com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NoClassDefFoundError: org.greenrobot.eventbus.EventBusBuilder at org.greenrobot.eventbus.EventBus.(EventBus.java:48) at com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) at android.app.ActivityThread.access$600(ActivityThread.java:130) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511)

他們已經在這個官方網站上發佈了一個解決方案,作爲 http://greenrobot.org/eventbus/documentation/faq/ 但這對我來說真的很難得到他們想說的解決方案。

下面是他們描述的內容,

一個java.lang.NoClassDefFoundError是扔當用戶類註冊。我能做什麼? 首先介紹一些背景知識,以幫助您瞭解這裏發生了什麼:某些Android版本在調用getDeclaredMethods或getMethods時似乎有反射問題。如果該類的方法的參數對設備的API級別不可用,則會引發異常。例如,PersistableBundle類是在API級別21中添加的。與新類一起,在具有PersistableBundle作爲參數的Activity類中引入了一些新的生命週期方法,例如onCreate(Bundle savedInstanceState,PersistableBundle persistentState)。現在,如果您重寫此方法,並嘗試在較舊的設備上將此Activity註冊到EventBus,那麼我們確切描述了導致錯誤的場景。瞭解發生這種情況的原因將有助於輕鬆解決問題。

這裏有幾個建議如何解決方案(檢查在給定的順序):

也許你改寫生命週期法PersistableBundle只是偶然。在這種情況下,只需更改爲沒有PersistableBundle的方法,例如onCreate(Bundle savedInstanceState)。

使用帶訂閱服務器索引的EventBus 3。這將避免反思,從而完全解決問題。作爲一個積極的副作用,註冊用戶和應用程序啓動時間將會快得多。

從訂戶類中刪除違規方法。將事件處理程序方法拉出到新的訂戶類中,或將違規方法拉出到非訂戶類中。

如果違規方法是公開的,請將其設爲非公開。這是因爲一些「計劃b」邏輯EventBus適用:EventBus首先調用getDeclaredMethods,這將失敗。接下來,EventBus將使用getMethods(「plan b」)再次嘗試。後者將成功,因爲getMethods只返回公共方法。但是,請記住,性能方面效率最低(2個反射調用,而getMethods考慮整個類層次)。以上

非工作按我的理解中,他們也有一些開放式的問題,如, https://github.com/greenrobot/EventBus/issues/287 https://github.com/greenrobot/EventBus/issues/302 沒有人提出任何可信的解決方案的任何幫助,將不勝感激。

+0

在Android 4.2及以上版本中,EventBus對我來說工作得很好。一些問題可以放大問題。你是否面對65k方法限制問題?你是否爲你的應用啓用了multidex?您是否在應用程序中定義了應用程序類? – drulabs

+0

不,我沒有遇到65k方法的限制, 是的multidex爲應用程序啓用,其正確工作5.0, 應用程序類也被定義爲根據他們的文檔。還沒有解決方案 –

+0

我遇到過類似的問題。讓我回答這個問題。 – drulabs

回答

7

從評論我認爲這個問題是multidex。發生這種情況是因爲可以啓用Android 5.0以上的MultiDex。對於運行pre 5.0 os版本的設備和模擬器。 Multidex必須以不同的方式啓用。

首先讓你的應用程序類擴展,而不是應用MultiDexApplication:

public class MyApplicationClass extends MultiDexApplication.... 
// use import android.support.multidex.MultiDexApplication; 

overried attachBaseContext()在這個類的方法,並把這個代碼:

@Override 
protected void attachBaseContext(Context base) { 
    super.attachBaseContext(base); 
    MultiDex.install(AppController.this); 
} 

放multidex依賴,並在應用程序的啓用build.grdle:

compile 'com.android.support:multidex:1.0.1' //dependencies section 
multiDexEnabled true //in default config 

此解決方案工作完美在棒棒糖設備前後都很好。

+0

這個解決方案可以幫助我。我有同樣的問題,這工作。 –

相關問題