簡體   English   中英

java.lang.NoClassDefFoundError在onStart中注冊eventbus時為4.4 os版本

[英]java.lang.NoClassDefFoundError while registering eventbus in onStart Method for 4.4 os version

集成事件總線庫后,它適用於操作系統版本5.0及更高版本,但導致4.4等較低版本的異常,並收到此錯誤,

java.lang.ExceptionInInitializerError在com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53)在android.app.Activity.performCreate(Activity.java:5008)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java: 1079)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)在android.app.ActivityThread.access $ 600(ActivityThread.java:130)在android .app.ActivityThread $ H.handleMessage(ActivityThread.java:1195)位於android.app的android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:137)。 ActivityThread.main(ActivityThread.java:4745)位於java.lang.reflect.Method.invokeNative(Native Method),位於com.android.internal.os的java.lang.reflect.Method.invoke(Method.java:511)。 ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)at dalvik.system.NativeStart.main(Native 方法造成的)的條件:java.lang.NoClassDefFoundError:org.greenrobot.eventbus.EventBusBuilder在org.greenrobot.eventbus.EventBus(EventBus.java:48)在com.tbox.doormanapp.GuestListActivity.onCreate(GuestListActivity.java:53。 )android.app.A活動中的android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1079)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)的android.app.Activity.performCreate(Activity.java:5008) .ActivityThread.handleLaunchActivity(ActivityThread.java:2084)在Android.app.Handler的android.app.ActivityThread.access $ 600(ActivityThread.java:130)android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195) android.app.Looper.loop(Looper.java:137)中的.dispatchMessage(Handler.java:99)位於android.app.ActivityThread.main(ActivityThread.java:4745)的java.lang.reflect.Method.invokeNative( java.lang.reflect.Method.invoke上的Native Method)(Method.java:511)

他們發布了有關此此官方網站的解決方案,因為http://greenrobot.org/eventbus/documentation/faq/但是這真的很難,我讓他們想表達的解決方案。

這是他們描述的,

注冊訂閱者類時拋出java.lang.NoClassDefFoundError。 我能做什么? 首先是一些背景知識,以幫助您了解這里發生了什么:一些Android版本在調用getDeclaredMethods或getMethods時似乎有反射錯誤。 如果類具有帶有設備API級別不可用的參數的方法,則拋出異常。 例如,在API級別21中添加了PersistableBundle類。除了新類之外,還在具有PersistableBundle作為參數的Activity類中引入了一些新的生命周期方法,例如onCreate(Bundle savedInstanceState,PersistableBundle persistentState)。 現在,如果您重寫此方法並嘗試在舊設備上將此活動注冊到EventBus,那么我們確實描述了導致錯誤的方案。 了解發生這種情況的原因將有助於輕松解決問題。

以下是一些如何修復方案的建議(檢查訂單):

也許你只是偶然用PersistableBundle覆蓋了一個生命周期方法。 在這種情況下,只需更改為不帶PersistableBundle的方法,例如onCreate(Bundle savedInstanceState)。

將EventBus 3與訂戶索引一起使用。 這樣可以避免反射,從而避免問題。 作為一個積極的副作用,注冊訂閱者和應用程序啟動時間會快得多。

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

如果違規方法是公開的,則將其設為非公開。 這是因為一些“計划b”邏輯EventBus適用:EventBus首先調用getDeclaredMethods,這將失敗。 接下來,EventBus將使用getMethods(“plan b”)再次嘗試。 后者將成功,因為getMethods只返回公共方法。 但是,請記住,就性能而言,這是效率最低的方式(考慮到整個類層次結構,2個反射調用而不是1個getMethods)。

上述非工作按我的理解中,他們也很喜歡,一些懸而未決的問題https://github.com/greenrobot/EventBus/issues/287 https://github.com/greenrobot/EventBus/issues/302沒有人提出任何真實的解決方案任何幫助將受到高度贊賞。

從評論我認為問題是multidex。 這是因為可以啟用Android 5.0以及MultiDex。 對於運行5.0之前版本的設備和模擬器。 必須以不同的方式啟用Multidex。

首先使您的應用程序類擴展MultiDexApplication而不是Application:

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

在這個類中重載了attachBaseContext()方法並放入此代碼:

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

放置multidex依賴項並在app的build.grdle中啟用它:

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

這種解決方案在Lollipop前后設備上運行得非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM